Repository: ibis-project/ibis-substrait (language: python)

Issue:
ci: switch to manual release trigger
I'm piling in too much stuff in #675 to avoid multiple major version bumps with the current automatic release process.

Rather than create a horrible PR over there, I'm going to switch us over to a push-button release process here.


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 8bbc04e7..569e2c7b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -59,7 +59,6 @@ jobs:
         os:
           - ubuntu-latest
         python-version:
-          - "38"
           - "39"
           - "310"
           - "311"
@@ -90,16 +89,18 @@ jobs:
         os:
           - ubuntu-latest
         python-version:
-          - "3.8"
-          - "3.10"
+          - "3.9"
+          - "3.11"
         ibis-version:
-          - "3.2"
           - "4.1"
           - "5.1"
         include:
          - os: windows-latest
+           python-version: "3.11"
+           ibis-version: "5.1"
+         - os: ubuntu-latest
            python-version: "3.10"
-           ibis-version: "4.1"
+           ibis-version: "3.2"
 
 
     steps:
@@ -130,11 +131,15 @@ jobs:
         os:
           - ubuntu-latest
         python-version:
-          - "3.8"
-          - "3.10"
+          - "3.9"
+          - "3.11"
         ibis-version:
-          - "3.2"
           - "4.1"
+          - "5.1"
+        include:
+          - os: ubuntu-latest
+            python-version: "3.10"
+            ibis-version: "3.2"
 
     steps:
       - uses: actions/checkout@v3
diff --git a/build.py b/build.py
deleted file mode 100644
index 469a589e..00000000
--- a/build.py
+++ /dev/null
@@ -1,7 +0,0 @@
-import os
-import subprocess
-
-
-def build(setup_kwargs):
-    if (proto_dir := os.environ.get("PROTO_DIR")) is not None:
-        subprocess.run(["./gen-protos.sh", proto_dir], check=True)
diff --git a/flake.nix b/flake.nix
index 89078f1c..01648402 100644
--- a/flake.nix
+++ b/flake.nix
@@ -47,14 +47,6 @@
       };
       inherit (pkgs) lib;
 
-      genProtos = pkgs.writeShellApplication {
-        name = "gen-protos";
-        runtimeInputs = [ pkgs.buf ];
-        text = ''
-          ${./gen-protos.sh} "${pkgs.substrait}/proto"
-        '';
-      };
-
       preCommitDeps = with pkgs; [
         actionlint
         git
@@ -76,28 +68,20 @@
 
           name = "ibis-substrait-${pythonVersion}";
           nativeBuildInputs = (with pkgs; [
-            buf
             cacert
             cachix
-            genProtos
-            jq
             nixpkgs-fmt
             poetry
-            protobuf3_20
-            sd
-            yj
           ])
           ++ [ pkgs."ibisSubstraitDevEnv${shortPythonVersion}" ]
           ++ preCommitDeps;
 
           inherit (self.checks.${system}.pre-commit-check) shellHook;
-          PROTO_DIR = "${pkgs.substrait}/proto";
-          PROTO_HASH = "${pkgs.substrait.rev}";
         };
     in
     rec {
       packages = {
-        inherit (pkgs) ibisSubstrait38 ibisSubstrait39 ibisSubstrait310 ibisSubstrait311;
+        inherit (pkgs) ibisSubstrait39 ibisSubstrait310 ibisSubstrait311;
 
         default = pkgs.ibisSubstrait311;
       };
@@ -106,7 +90,6 @@
       nixpkgs = pkgs;
 
       devShells = rec {
-        ibisSubstrait38 = mkDevShell pkgs.ibisSubstraitDevEnv38;
         ibisSubstrait39 = mkDevShell pkgs.ibisSubstraitDevEnv39;
         ibisSubstrait310 = mkDevShell pkgs.ibisSubstraitDevEnv310;
         ibisSubstrait311 = mkDevShell pkgs.ibisSubstraitDevEnv311;
diff --git a/gen-protos.sh b/gen-protos.sh
deleted file mode 100755
index 7b18b64b..00000000
--- a/gen-protos.sh
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/env bash
-
-set -eo pipefail
-
-substrait_protos="${1:-${PROTO_DIR}}"
-substrait_hash="${2:-${PROTO_HASH}}"
-
-set -u
-
-# Using Substrait requires protobuf >= 3.20.1
-# Generating the Python pb2 files requires protobuf == 3.20.1
-python -c "import google.protobuf; assert google.protobuf.__version__ == '3.20.1'"
-
-proto_dir=./proto
-extension_dir=./ibis_substrait/extensions
-
-mkdir -p "$proto_dir"
-mkdir -p "$extension_dir"
-chmod u+rwx "$proto_dir"
-chmod u+rwx "$extension_dir"
-rm -r "$proto_dir"
-rm -r "$extension_dir"
-
-cp -fr "$substrait_protos" "$proto_dir"
-cp -fr "$substrait_protos/../extensions" "$extension_dir"
-
-find "$proto_dir" -type d -exec chmod u+rwx {} +
-find "$proto_dir" -type f -exec chmod u+rw {} +
-find "$extension_dir" -type d -exec chmod u+rwx {} +
-find "$extension_dir" -type f -exec chmod u+rw {} +
-
-rm -rf ./ibis_substrait/proto
-
-python proto_prefix.py "$proto_dir"/tmp substrait.ibis "$proto_dir"/substrait
-
-mv "$proto_dir"/substrait substrait.bak
-mv "$proto_dir"/tmp/substrait "$proto_dir"
-
-buf generate
-protol --in-place --create-package --python-out "./ibis_substrait/proto" buf
-
-rm -rf "$proto_dir"/tmp
-rm -rf "$proto_dir"/substrait
-mv substrait.bak "$proto_dir"/substrait
-
-# Insert current substrait rev into __init__.py
-sed -i '/__substrait_hash__/d' ./ibis_substrait/__init__.py
-echo "__substrait_hash__ = \"$substrait_hash\"" >> ./ibis_substrait/__init__.py
diff --git a/ibis_substrait/__init__.py b/ibis_substrait/__init__.py
index 6073f6d4..17bc23e6 100644
--- a/ibis_substrait/__init__.py
+++ b/ibis_substrait/__init__.py
@@ -1,3 +1,6 @@
-__version__ = "2.29.1"
-__substrait_version__ = "0.24.0"
-__substrait_hash__ = "335a4dc74ccb3ef88769878d36c35e511e47ef70"
+__version__ = "2.29.0"
+
+import substrait
+
+__substrait_version__ = substrait.__substrait_version__
+__substrait_hash__ = substrait.__substrait_hash__
diff --git a/ibis_substrait/compiler/core.py b/ibis_substrait/compiler/core.py
index dfb5a2bf..30670dfa 100644
--- a/ibis_substrait/compiler/core.py
+++ b/ibis_substrait/compiler/core.py
@@ -3,13 +3,16 @@
 from __future__ import annotations
 
 import itertools
-from typing import Any, Hashable, Iterator
+from collections.abc import Hashable, Iterator
+from typing import TYPE_CHECKING, Any
 
-import google.protobuf.message as msg
 import ibis.expr.datatypes as dt
 import ibis.expr.operations as ops
 import ibis.expr.types as ir
 from packaging.version import parse as vparse
+from substrait.gen.proto import algebra_pb2 as stalg
+from substrait.gen.proto import plan_pb2 as stp
+from substrait.gen.proto.extensions import extensions_pb2 as ste
 
 from ibis_substrait import __substrait_hash__, __substrait_version__
 from ibis_substrait.compiler.mapping import (
@@ -17,9 +20,9 @@
     IBIS_SUBSTRAIT_TYPE_MAPPING,
     _extension_mapping,
 )
-from ibis_substrait.proto.substrait.ibis import algebra_pb2 as stalg
-from ibis_substrait.proto.substrait.ibis import plan_pb2 as stp
-from ibis_substrait.proto.substrait.ibis.extensions import extensions_pb2 as ste
+
+if TYPE_CHECKING:
+    import google.protobuf.message as msg
 
 
 def which_one_of(message: msg.Message, oneof_name: str) -> tuple[str, Any]:
diff --git a/ibis_substrait/compiler/decompile.py b/ibis_substrait/compiler/decompile.py
index 0a011068..6ef3ad1d 100644
--- a/ibis_substrait/compiler/decompile.py
+++ b/ibis_substrait/compiler/decompile.py
@@ -11,7 +11,8 @@
 import functools
 import operator
 import uuid
-from typing import Any, Callable, Deque, Hashable, Sequence, TypeVar
+from collections.abc import Hashable, Sequence
+from typing import Any, Callable, TypeVar
 
 import ibis
 import ibis.expr.datatypes as dt
@@ -20,6 +21,9 @@
 import ibis.expr.types as ir
 import pytz
 import toolz
+from substrait.gen.proto import algebra_pb2 as stalg
+from substrait.gen.proto import plan_pb2 as stp
+from substrait.gen.proto import type_pb2 as stt
 
 from ibis_substrait.compiler.core import SubstraitDecompiler, _get_fields, which_one_of
 from ibis_substrait.compiler.mapping import SUBSTRAIT_IBIS_OP_MAPPING
@@ -28,9 +32,6 @@
     _MINUTES_PER_HOUR,
     _SECONDS_PER_MINUTE,
 )
-from ibis_substrait.proto.substrait.ibis import algebra_pb2 as stalg
-from ibis_substrait.proto.substrait.ibis import plan_pb2 as stp
-from ibis_substrait.proto.substrait.ibis import type_pb2 as stt
 
 try:
     from ibis.expr.operations import CountStar
@@ -181,14 +182,16 @@ def _decompile_type_map(typ: stt.Type.Map, nullable: bool) -> dt.DataType:
 
 
 @functools.singledispatch
-def _decompile_field(typ: Any, names: Deque[str], *args: Any) -> dt.DataType:
+def _decompile_field(
+    typ: Any, names: collections.deque[str], *args: Any
+) -> dt.DataType:
     raise NotImplementedError(f"unknown field type when decompiling: {type(typ)}")
 
 
 @_decompile_field.register
 def _decompile_field_generic(
     typ: stt.Type,
-    names: Deque[str],
+    names: collections.deque[str],
 ) -> dt.DataType:
     _, kind = which_one_of(typ, "kind")
     return _decompile_field(kind, names, _decompile_nullability(kind))
@@ -210,14 +213,16 @@ def _decompile_field_generic(
 @_decompile_field.register(stt.Type.Time)
 @_decompile_field.register(stt.Type.UUID)
 @_decompile_field.register(stt.Type.Decimal)
-def _decompile_field_primitive(typ: Any, _: Deque[str], nullable: bool) -> dt.DataType:
+def _decompile_field_primitive(
+    typ: Any, _: collections.deque[str], nullable: bool
+) -> dt.DataType:
     return _decompile_type(typ, nullable)
 
 
 @_decompile_field.register
 def _decompile_field_array(
     typ: stt.Type.List,
-    names: Deque[str],
+    names: collections.deque[str],
     nullable: bool,
 ) -> dt.DataType:
     return dt.Array(
@@ -229,7 +234,7 @@ def _decompile_field_array(
 @_decompile_field.register
 def _decompile_field_map(
     typ: stt.Type.Map,
-    names: Deque[str],
+    names: collections.deque[str],
     nullable: bool,
 ) -> dt.DataType:
     return dt.Map(
@@ -241,7 +246,7 @@ def _decompile_field_map(
 
 def _decompile_struct_fields(
     typ: stt.Type.Struct,
-    names: Deque[str],
+    names: collections.deque[str],
 ) -> list[tuple[str, dt.DataType]]:
     fields = []
 
@@ -256,7 +261,7 @@ def _decompile_struct_fields(
 @_decompile_field.register
 def _st_to_ibis_struct(
     typ: stt.Type.Struct,
-    names: Deque[str],
+    names: collections.deque[str],
     nullable: bool,
 ) -> dt.DataType:
     fields = _decompile_struct_fields(typ, names)
@@ -345,7 +350,7 @@ def _decompile_rel_root(
 def _decompile_rel(
     rel: stalg.Rel,
     decompiler: SubstraitDecompiler,
-    names: Deque[str],
+    names: collections.deque[str],
 ) -> ir.TableExpr:
     _, rel_variant = which_one_of(rel, "rel_type")
     return decompile(rel_variant, decompiler, names)
@@ -355,7 +360,7 @@ def _decompile_rel(
 def _decompile_read_rel(
     read_rel: stalg.ReadRel,
     decompiler: SubstraitDecompiler,
-    _names: Deque[str],
+    _names: collections.deque[str],
 ) -> ir.TableExpr:
     _, read_rel_variant = which_one_of(read_rel, "read_type")
     schema = decompile_schema(read_rel)
@@ -393,7 +398,7 @@ def _get_child_tables_and_field_offsets(
 def _decompile_filter_rel(
     filter_rel: stalg.FilterRel,
     decompiler: SubstraitDecompiler,
-    names: Deque[str],
+    names: collections.deque[str],
 ) -> ir.TableExpr:
     child = decompile(filter_rel.input, decompiler, names)
     children, field_offsets = _get_child_tables_and_field_offsets(child)
@@ -405,7 +410,7 @@ def _decompile_filter_rel(
 def _decompile_fetch_rel(
     fetch_rel: stalg.FetchRel,
     decompiler: SubstraitDecompiler,
-    names: Deque[str],
+    names: collections.deque[str],
 ) -> ir.TableExpr:
     child = decompile(fetch_rel.input, decompiler, names)
     return child.limit(fetch_rel.count, offset=fetch_rel.offset)
@@ -425,7 +430,7 @@ def _decompile_fetch_rel(
 def _decompile_join_rel(
     join_rel: stalg.JoinRel,
     decompiler: SubstraitDecompiler,
-    names: Deque[str],
+    names: collections.deque[str],
 ) -> ir.TableExpr:
     left_child = decompile(join_rel.left, decompiler, names)
     right_child = decompile(join_rel.right, decompiler, names)
@@ -445,7 +450,7 @@ def _decompile_join_rel(
 def _decompile_sort_rel(
     sort_rel: stalg.SortRel,
     decompiler: SubstraitDecompiler,
-    names: Deque[str],
+    names: collections.deque[str],
 ) -> ir.TableExpr:
     child = decompile(sort_rel.input, decompiler, names)
     children, field_offsets = _get_child_tables_and_field_offsets(child)
@@ -455,7 +460,7 @@ def _decompile_sort_rel(
     return child.sort_by(sorts)
 
 
-def _remove_names_below(names: Deque[str], dtype: dt.DataType) -> None:
+def _remove_names_below(names: collections.deque[str], dtype: dt.DataType) -> None:
     """Remove all levels of `names` below the names in `dtype`.
 
     Examples
@@ -500,7 +505,7 @@ def _decompile_with_name(
     children: Sequence[ir.TableExpr],
     field_offsets: Sequence[int],
     decompiler: SubstraitDecompiler,
-    names: Deque[str],
+    names: collections.deque[str],
 ) -> ir.ValueExpr:
     expr_name = names.popleft()
     ibis_expr = decompile(expr, children, field_offsets, decompiler).name(expr_name)
@@ -515,7 +520,7 @@ def _decompile_with_name(
 def _decompile_project_rel(
     project_rel: stalg.ProjectRel,
     decompiler: SubstraitDecompiler,
-    names: Deque[str],
+    names: collections.deque[str],
 ) -> ir.TableExpr:
     child = decompile(project_rel.input, decompiler, names)
     children, field_offsets = _get_child_tables_and_field_offsets(child)
@@ -531,7 +536,7 @@ def _decompile_project_rel(
 def _decompile_aggregate_rel(
     aggregate_rel: stalg.AggregateRel,
     decompiler: SubstraitDecompiler,
-    names: Deque[str],
+    names: collections.deque[str],
 ) -> ir.TableExpr:
     # TODO: aggregate_rel.phase is ignored, do we need to preserve it?
     child = decompile(aggregate_rel.input, decompiler, names)
@@ -636,7 +641,7 @@ def _decompile_set_op(
     *,
     op: stalg.SetRel.SetOp.V,
     decompiler: SubstraitDecompiler,
-    names: Deque[str],
+    names: collections.deque[str],
 ) -> ir.TableExpr:
     left_expr = decompile(left, decompiler, names)
     right_expr = decompile(right, decompiler, names)
@@ -651,7 +656,7 @@ def _decompile_set_op(
 def _decompile_set_op_rel(
     set_rel: stalg.SetRel,
     decompiler: SubstraitDecompiler,
-    names: Deque[str],
+    names: collections.deque[str],
 ) -> ir.TableExpr:
     return functools.reduce(
         functools.partial(
diff --git a/ibis_substrait/compiler/mapping.py b/ibis_substrait/compiler/mapping.py
index f820a831..654e4f52 100644
--- a/ibis_substrait/compiler/mapping.py
+++ b/ibis_substrait/compiler/mapping.py
@@ -2,8 +2,9 @@
 
 import importlib.resources
 from collections import defaultdict
+from collections.abc import Iterator, Mapping
 from pathlib import Path
-from typing import Any, Iterator, Mapping
+from typing import Any
 
 import ibis.expr.operations as ops
 import yaml
@@ -215,24 +216,10 @@ def register_extension_yaml(
 
 
 def _populate_default_extensions() -> None:
-    # TODO: we should load all the yaml files and not maintain this list
-    EXTENSION_YAMLS = [
-        "functions_aggregate_approx.yaml",
-        "functions_aggregate_generic.yaml",
-        "functions_arithmetic.yaml",
-        "functions_arithmetic_decimal.yaml",
-        "functions_boolean.yaml",
-        "functions_comparison.yaml",
-        "functions_datetime.yaml",
-        "functions_logarithmic.yaml",
-        "functions_rounding.yaml",
-        "functions_set.yaml",
-        "functions_string.yaml",
-    ]
-
-    for yaml_file in EXTENSION_YAMLS:
-        with importlib.resources.path("ibis_substrait.extensions", yaml_file) as fpath:
-            register_extension_yaml(fpath)
+    for fpath in importlib.resources.files("substrait.extensions").glob(  # type: ignore
+        "functions*.yaml"
+    ):
+        register_extension_yaml(fpath)
 
 
 _populate_default_extensions()
diff --git a/ibis_substrait/compiler/translate.py b/ibis_substrait/compiler/translate.py
index b0506fa8..7286482f 100644
--- a/ibis_substrait/compiler/translate.py
+++ b/ibis_substrait/compiler/translate.py
@@ -14,7 +14,8 @@
 import math
 import operator
 import uuid
-from typing import Any, Iterable, Mapping, MutableMapping, Sequence, TypeVar, Union
+from collections.abc import Iterable, Mapping, MutableMapping, Sequence
+from typing import Any, TypeVar, Union
 
 import ibis
 import ibis.expr.datatypes as dt
@@ -24,14 +25,14 @@
 import toolz
 from ibis import util
 from packaging import version
+from substrait.gen.proto import algebra_pb2 as stalg
+from substrait.gen.proto import type_pb2 as stt
 
 from ibis_substrait.compiler.core import SubstraitCompiler, _get_fields
 from ibis_substrait.compiler.mapping import (
     IBIS_SUBSTRAIT_OP_MAPPING,
     _extension_mapping,
 )
-from ibis_substrait.proto.substrait.ibis import algebra_pb2 as stalg
-from ibis_substrait.proto.substrait.ibis import type_pb2 as stt
 
 try:
     from typing import TypeAlias
diff --git a/ibis_substrait/proto/__init__.py b/ibis_substrait/proto/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/ibis_substrait/proto/__init__.pyi b/ibis_substrait/proto/__init__.pyi
deleted file mode 100644
index 31cb7c20..00000000
--- a/ibis_substrait/proto/__init__.pyi
+++ /dev/null
@@ -1,1 +0,0 @@
-from . import substrait
diff --git a/ibis_substrait/proto/substrait/__init__.py b/ibis_substrait/proto/substrait/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/ibis_substrait/proto/substrait/__init__.pyi b/ibis_substrait/proto/substrait/__init__.pyi
deleted file mode 100644
index 5b8fefd9..00000000
--- a/ibis_substrait/proto/substrait/__init__.pyi
+++ /dev/null
@@ -1,1 +0,0 @@
-from . import ibis
diff --git a/ibis_substrait/proto/substrait/ibis/__init__.py b/ibis_substrait/proto/substrait/ibis/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/ibis_substrait/proto/substrait/ibis/__init__.pyi b/ibis_substrait/proto/substrait/ibis/__init__.pyi
deleted file mode 100644
index 83c7726e..00000000
--- a/ibis_substrait/proto/substrait/ibis/__init__.pyi
+++ /dev/null
@@ -1,9 +0,0 @@
-from . import extensions
-from . import extended_expression_pb2
-from . import function_pb2
-from . import plan_pb2
-from . import capabilities_pb2
-from . import type_pb2
-from . import parameterized_types_pb2
-from . import algebra_pb2
-from . import type_expressions_pb2
diff --git a/ibis_substrait/proto/substrait/ibis/algebra_pb2.py b/ibis_substrait/proto/substrait/ibis/algebra_pb2.py
deleted file mode 100644
index 0ba6f19b..00000000
--- a/ibis_substrait/proto/substrait/ibis/algebra_pb2.py
+++ /dev/null
@@ -1,273 +0,0 @@
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-_sym_db = _symbol_database.Default()
-from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2
-from ...substrait.ibis.extensions import extensions_pb2 as substrait_dot_ibis_dot_extensions_dot_extensions__pb2
-from ...substrait.ibis import type_pb2 as substrait_dot_ibis_dot_type__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1csubstrait/ibis/algebra.proto\x12\x0esubstrait.ibis\x1a\x19google/protobuf/any.proto\x1a*substrait/ibis/extensions/extensions.proto\x1a\x19substrait/ibis/type.proto"\xdf\x06\n\tRelCommon\x12:\n\x06direct\x18\x01 \x01(\x0b2 .substrait.ibis.RelCommon.DirectH\x00R\x06direct\x124\n\x04emit\x18\x02 \x01(\x0b2\x1e.substrait.ibis.RelCommon.EmitH\x00R\x04emit\x122\n\x04hint\x18\x03 \x01(\x0b2\x1e.substrait.ibis.RelCommon.HintR\x04hint\x12[\n\x12advanced_extension\x18\x04 \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension\x1a\x08\n\x06Direct\x1a-\n\x04Emit\x12%\n\x0eoutput_mapping\x18\x01 \x03(\x05R\routputMapping\x1a\x88\x04\n\x04Hint\x12:\n\x05stats\x18\x01 \x01(\x0b2$.substrait.ibis.RelCommon.Hint.StatsR\x05stats\x12P\n\nconstraint\x18\x02 \x01(\x0b20.substrait.ibis.RelCommon.Hint.RuntimeConstraintR\nconstraint\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension\x1a\xa2\x01\n\x05Stats\x12\x1b\n\trow_count\x18\x01 \x01(\x01R\x08rowCount\x12\x1f\n\x0brecord_size\x18\x02 \x01(\x01R\nrecordSize\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension\x1ap\n\x11RuntimeConstraint\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtensionB\x0b\n\temit_kind"\x99\x0f\n\x07ReadRel\x121\n\x06common\x18\x01 \x01(\x0b2\x19.substrait.ibis.RelCommonR\x06common\x12<\n\x0bbase_schema\x18\x02 \x01(\x0b2\x1b.substrait.ibis.NamedStructR\nbaseSchema\x122\n\x06filter\x18\x03 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x06filter\x12H\n\x12best_effort_filter\x18\x0b \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x10bestEffortFilter\x12I\n\nprojection\x18\x04 \x01(\x0b2).substrait.ibis.Expression.MaskExpressionR\nprojection\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension\x12K\n\rvirtual_table\x18\x05 \x01(\x0b2$.substrait.ibis.ReadRel.VirtualTableH\x00R\x0cvirtualTable\x12E\n\x0blocal_files\x18\x06 \x01(\x0b2".substrait.ibis.ReadRel.LocalFilesH\x00R\nlocalFiles\x12E\n\x0bnamed_table\x18\x07 \x01(\x0b2".substrait.ibis.ReadRel.NamedTableH\x00R\nnamedTable\x12Q\n\x0fextension_table\x18\x08 \x01(\x0b2&.substrait.ibis.ReadRel.ExtensionTableH\x00R\x0eextensionTable\x1a\x7f\n\nNamedTable\x12\x14\n\x05names\x18\x01 \x03(\tR\x05names\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension\x1aQ\n\x0cVirtualTable\x12A\n\x06values\x18\x01 \x03(\x0b2).substrait.ibis.Expression.Literal.StructR\x06values\x1a>\n\x0eExtensionTable\x12,\n\x06detail\x18\x01 \x01(\x0b2\x14.google.protobuf.AnyR\x06detail\x1a\xa7\x07\n\nLocalFiles\x12D\n\x05items\x18\x01 \x03(\x0b2..substrait.ibis.ReadRel.LocalFiles.FileOrFilesR\x05items\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension\x1a\xf5\x05\n\x0bFileOrFiles\x12\x1b\n\x08uri_path\x18\x01 \x01(\tH\x00R\x07uriPath\x12$\n\ruri_path_glob\x18\x02 \x01(\tH\x00R\x0buriPathGlob\x12\x1b\n\x08uri_file\x18\x03 \x01(\tH\x00R\x07uriFile\x12\x1f\n\nuri_folder\x18\x04 \x01(\tH\x00R\turiFolder\x12\'\n\x0fpartition_index\x18\x06 \x01(\x04R\x0epartitionIndex\x12\x14\n\x05start\x18\x07 \x01(\x04R\x05start\x12\x16\n\x06length\x18\x08 \x01(\x04R\x06length\x12]\n\x07parquet\x18\t \x01(\x0b2A.substrait.ibis.ReadRel.LocalFiles.FileOrFiles.ParquetReadOptionsH\x01R\x07parquet\x12W\n\x05arrow\x18\n \x01(\x0b2?.substrait.ibis.ReadRel.LocalFiles.FileOrFiles.ArrowReadOptionsH\x01R\x05arrow\x12Q\n\x03orc\x18\x0b \x01(\x0b2=.substrait.ibis.ReadRel.LocalFiles.FileOrFiles.OrcReadOptionsH\x01R\x03orc\x124\n\textension\x18\x0c \x01(\x0b2\x14.google.protobuf.AnyH\x01R\textension\x12T\n\x04dwrf\x18\r \x01(\x0b2>.substrait.ibis.ReadRel.LocalFiles.FileOrFiles.DwrfReadOptionsH\x01R\x04dwrf\x1a\x14\n\x12ParquetReadOptions\x1a\x12\n\x10ArrowReadOptions\x1a\x10\n\x0eOrcReadOptions\x1a\x11\n\x0fDwrfReadOptionsB\x0b\n\tpath_typeB\r\n\x0bfile_formatJ\x04\x08\x05\x10\x06R\x06formatB\x0b\n\tread_type"\x85\x02\n\nProjectRel\x121\n\x06common\x18\x01 \x01(\x0b2\x19.substrait.ibis.RelCommonR\x06common\x12)\n\x05input\x18\x02 \x01(\x0b2\x13.substrait.ibis.RelR\x05input\x12<\n\x0bexpressions\x18\x03 \x03(\x0b2\x1a.substrait.ibis.ExpressionR\x0bexpressions\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension"\xde\x04\n\x07JoinRel\x121\n\x06common\x18\x01 \x01(\x0b2\x19.substrait.ibis.RelCommonR\x06common\x12\'\n\x04left\x18\x02 \x01(\x0b2\x13.substrait.ibis.RelR\x04left\x12)\n\x05right\x18\x03 \x01(\x0b2\x13.substrait.ibis.RelR\x05right\x12:\n\nexpression\x18\x04 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\nexpression\x12D\n\x10post_join_filter\x18\x05 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x0epostJoinFilter\x124\n\x04type\x18\x06 \x01(\x0e2 .substrait.ibis.JoinRel.JoinTypeR\x04type\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension"\xb6\x01\n\x08JoinType\x12\x19\n\x15JOIN_TYPE_UNSPECIFIED\x10\x00\x12\x13\n\x0fJOIN_TYPE_INNER\x10\x01\x12\x13\n\x0fJOIN_TYPE_OUTER\x10\x02\x12\x12\n\x0eJOIN_TYPE_LEFT\x10\x03\x12\x13\n\x0fJOIN_TYPE_RIGHT\x10\x04\x12\x12\n\x0eJOIN_TYPE_SEMI\x10\x05\x12\x12\n\x0eJOIN_TYPE_ANTI\x10\x06\x12\x14\n\x10JOIN_TYPE_SINGLE\x10\x07"\xee\x01\n\x08CrossRel\x121\n\x06common\x18\x01 \x01(\x0b2\x19.substrait.ibis.RelCommonR\x06common\x12\'\n\x04left\x18\x02 \x01(\x0b2\x13.substrait.ibis.RelR\x04left\x12)\n\x05right\x18\x03 \x01(\x0b2\x13.substrait.ibis.RelR\x05right\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension"\xf3\x01\n\x08FetchRel\x121\n\x06common\x18\x01 \x01(\x0b2\x19.substrait.ibis.RelCommonR\x06common\x12)\n\x05input\x18\x02 \x01(\x0b2\x13.substrait.ibis.RelR\x05input\x12\x16\n\x06offset\x18\x03 \x01(\x03R\x06offset\x12\x14\n\x05count\x18\x04 \x01(\x03R\x05count\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension"\xa7\x04\n\x0cAggregateRel\x121\n\x06common\x18\x01 \x01(\x0b2\x19.substrait.ibis.RelCommonR\x06common\x12)\n\x05input\x18\x02 \x01(\x0b2\x13.substrait.ibis.RelR\x05input\x12C\n\tgroupings\x18\x03 \x03(\x0b2%.substrait.ibis.AggregateRel.GroupingR\tgroupings\x12@\n\x08measures\x18\x04 \x03(\x0b2$.substrait.ibis.AggregateRel.MeasureR\x08measures\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension\x1aY\n\x08Grouping\x12M\n\x14grouping_expressions\x18\x01 \x03(\x0b2\x1a.substrait.ibis.ExpressionR\x13groupingExpressions\x1az\n\x07Measure\x12;\n\x07measure\x18\x01 \x01(\x0b2!.substrait.ibis.AggregateFunctionR\x07measure\x122\n\x06filter\x18\x02 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x06filter"\xf5\x01\n\x07SortRel\x121\n\x06common\x18\x01 \x01(\x0b2\x19.substrait.ibis.RelCommonR\x06common\x12)\n\x05input\x18\x02 \x01(\x0b2\x13.substrait.ibis.RelR\x05input\x12/\n\x05sorts\x18\x03 \x03(\x0b2\x19.substrait.ibis.SortFieldR\x05sorts\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension"\x80\x02\n\tFilterRel\x121\n\x06common\x18\x01 \x01(\x0b2\x19.substrait.ibis.RelCommonR\x06common\x12)\n\x05input\x18\x02 \x01(\x0b2\x13.substrait.ibis.RelR\x05input\x128\n\tcondition\x18\x03 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\tcondition\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension"\xbe\x03\n\x06SetRel\x121\n\x06common\x18\x01 \x01(\x0b2\x19.substrait.ibis.RelCommonR\x06common\x12+\n\x06inputs\x18\x02 \x03(\x0b2\x13.substrait.ibis.RelR\x06inputs\x12,\n\x02op\x18\x03 \x01(\x0e2\x1c.substrait.ibis.SetRel.SetOpR\x02op\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension"\xc8\x01\n\x05SetOp\x12\x16\n\x12SET_OP_UNSPECIFIED\x10\x00\x12\x18\n\x14SET_OP_MINUS_PRIMARY\x10\x01\x12\x19\n\x15SET_OP_MINUS_MULTISET\x10\x02\x12\x1f\n\x1bSET_OP_INTERSECTION_PRIMARY\x10\x03\x12 \n\x1cSET_OP_INTERSECTION_MULTISET\x10\x04\x12\x19\n\x15SET_OP_UNION_DISTINCT\x10\x05\x12\x14\n\x10SET_OP_UNION_ALL\x10\x06"\xa0\x01\n\x12ExtensionSingleRel\x121\n\x06common\x18\x01 \x01(\x0b2\x19.substrait.ibis.RelCommonR\x06common\x12)\n\x05input\x18\x02 \x01(\x0b2\x13.substrait.ibis.RelR\x05input\x12,\n\x06detail\x18\x03 \x01(\x0b2\x14.google.protobuf.AnyR\x06detail"s\n\x10ExtensionLeafRel\x121\n\x06common\x18\x01 \x01(\x0b2\x19.substrait.ibis.RelCommonR\x06common\x12,\n\x06detail\x18\x02 \x01(\x0b2\x14.google.protobuf.AnyR\x06detail"\xa1\x01\n\x11ExtensionMultiRel\x121\n\x06common\x18\x01 \x01(\x0b2\x19.substrait.ibis.RelCommonR\x06common\x12+\n\x06inputs\x18\x02 \x03(\x0b2\x13.substrait.ibis.RelR\x06inputs\x12,\n\x06detail\x18\x03 \x01(\x0b2\x14.google.protobuf.AnyR\x06detail"\xd6\t\n\x0bExchangeRel\x121\n\x06common\x18\x01 \x01(\x0b2\x19.substrait.ibis.RelCommonR\x06common\x12)\n\x05input\x18\x02 \x01(\x0b2\x13.substrait.ibis.RelR\x05input\x12\'\n\x0fpartition_count\x18\x03 \x01(\x05R\x0epartitionCount\x12D\n\x07targets\x18\x04 \x03(\x0b2*.substrait.ibis.ExchangeRel.ExchangeTargetR\x07targets\x12W\n\x11scatter_by_fields\x18\x05 \x01(\x0b2).substrait.ibis.ExchangeRel.ScatterFieldsH\x00R\x0fscatterByFields\x12Y\n\rsingle_target\x18\x06 \x01(\x0b22.substrait.ibis.ExchangeRel.SingleBucketExpressionH\x00R\x0csingleTarget\x12V\n\x0cmulti_target\x18\x07 \x01(\x0b21.substrait.ibis.ExchangeRel.MultiBucketExpressionH\x00R\x0bmultiTarget\x12I\n\x0bround_robin\x18\x08 \x01(\x0b2&.substrait.ibis.ExchangeRel.RoundRobinH\x00R\nroundRobin\x12E\n\tbroadcast\x18\t \x01(\x0b2%.substrait.ibis.ExchangeRel.BroadcastH\x00R\tbroadcast\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension\x1aR\n\rScatterFields\x12A\n\x06fields\x18\x01 \x03(\x0b2).substrait.ibis.Expression.FieldReferenceR\x06fields\x1aT\n\x16SingleBucketExpression\x12:\n\nexpression\x18\x01 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\nexpression\x1a\x85\x01\n\x15MultiBucketExpression\x12:\n\nexpression\x18\x01 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\nexpression\x120\n\x14constrained_to_count\x18\x02 \x01(\x08R\x12constrainedToCount\x1a\x0b\n\tBroadcast\x1a"\n\nRoundRobin\x12\x14\n\x05exact\x18\x01 \x01(\x08R\x05exact\x1a\x8a\x01\n\x0eExchangeTarget\x12!\n\x0cpartition_id\x18\x01 \x03(\x05R\x0bpartitionId\x12\x12\n\x03uri\x18\x02 \x01(\tH\x00R\x03uri\x122\n\x08extended\x18\x03 \x01(\x0b2\x14.google.protobuf.AnyH\x00R\x08extendedB\r\n\x0btarget_typeB\x0f\n\rexchange_kind"J\n\x07RelRoot\x12)\n\x05input\x18\x01 \x01(\x0b2\x13.substrait.ibis.RelR\x05input\x12\x14\n\x05names\x18\x02 \x03(\tR\x05names"\xbe\x06\n\x03Rel\x12-\n\x04read\x18\x01 \x01(\x0b2\x17.substrait.ibis.ReadRelH\x00R\x04read\x123\n\x06filter\x18\x02 \x01(\x0b2\x19.substrait.ibis.FilterRelH\x00R\x06filter\x120\n\x05fetch\x18\x03 \x01(\x0b2\x18.substrait.ibis.FetchRelH\x00R\x05fetch\x12<\n\taggregate\x18\x04 \x01(\x0b2\x1c.substrait.ibis.AggregateRelH\x00R\taggregate\x12-\n\x04sort\x18\x05 \x01(\x0b2\x17.substrait.ibis.SortRelH\x00R\x04sort\x12-\n\x04join\x18\x06 \x01(\x0b2\x17.substrait.ibis.JoinRelH\x00R\x04join\x126\n\x07project\x18\x07 \x01(\x0b2\x1a.substrait.ibis.ProjectRelH\x00R\x07project\x12*\n\x03set\x18\x08 \x01(\x0b2\x16.substrait.ibis.SetRelH\x00R\x03set\x12O\n\x10extension_single\x18\t \x01(\x0b2".substrait.ibis.ExtensionSingleRelH\x00R\x0fextensionSingle\x12L\n\x0fextension_multi\x18\n \x01(\x0b2!.substrait.ibis.ExtensionMultiRelH\x00R\x0eextensionMulti\x12I\n\x0eextension_leaf\x18\x0b \x01(\x0b2 .substrait.ibis.ExtensionLeafRelH\x00R\rextensionLeaf\x120\n\x05cross\x18\x0c \x01(\x0b2\x18.substrait.ibis.CrossRelH\x00R\x05cross\x12:\n\thash_join\x18\r \x01(\x0b2\x1b.substrait.ibis.HashJoinRelH\x00R\x08hashJoin\x12=\n\nmerge_join\x18\x0e \x01(\x0b2\x1c.substrait.ibis.MergeJoinRelH\x00R\tmergeJoinB\n\n\x08rel_type"\x85\x01\n\x10NamedObjectWrite\x12\x14\n\x05names\x18\x01 \x03(\tR\x05names\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension"?\n\x0fExtensionObject\x12,\n\x06detail\x18\x01 \x01(\x0b2\x14.google.protobuf.AnyR\x06detail"\xc7\x05\n\x06DdlRel\x12E\n\x0cnamed_object\x18\x01 \x01(\x0b2 .substrait.ibis.NamedObjectWriteH\x00R\x0bnamedObject\x12L\n\x10extension_object\x18\x02 \x01(\x0b2\x1f.substrait.ibis.ExtensionObjectH\x00R\x0fextensionObject\x12>\n\x0ctable_schema\x18\x03 \x01(\x0b2\x1b.substrait.ibis.NamedStructR\x0btableSchema\x12P\n\x0etable_defaults\x18\x04 \x01(\x0b2).substrait.ibis.Expression.Literal.StructR\rtableDefaults\x128\n\x06object\x18\x05 \x01(\x0e2 .substrait.ibis.DdlRel.DdlObjectR\x06object\x12,\n\x02op\x18\x06 \x01(\x0e2\x1c.substrait.ibis.DdlRel.DdlOpR\x02op\x12<\n\x0fview_definition\x18\x07 \x01(\x0b2\x13.substrait.ibis.RelR\x0eviewDefinition"R\n\tDdlObject\x12\x1a\n\x16DDL_OBJECT_UNSPECIFIED\x10\x00\x12\x14\n\x10DDL_OBJECT_TABLE\x10\x01\x12\x13\n\x0fDDL_OBJECT_VIEW\x10\x02"\x8d\x01\n\x05DdlOp\x12\x16\n\x12DDL_OP_UNSPECIFIED\x10\x00\x12\x11\n\rDDL_OP_CREATE\x10\x01\x12\x1c\n\x18DDL_OP_CREATE_OR_REPLACE\x10\x02\x12\x10\n\x0cDDL_OP_ALTER\x10\x03\x12\x0f\n\x0bDDL_OP_DROP\x10\x04\x12\x18\n\x14DDL_OP_DROP_IF_EXIST\x10\x05B\x0c\n\nwrite_type"\xe1\x04\n\x08WriteRel\x12C\n\x0bnamed_table\x18\x01 \x01(\x0b2 .substrait.ibis.NamedObjectWriteH\x00R\nnamedTable\x12J\n\x0fextension_table\x18\x02 \x01(\x0b2\x1f.substrait.ibis.ExtensionObjectH\x00R\x0eextensionTable\x12>\n\x0ctable_schema\x18\x03 \x01(\x0b2\x1b.substrait.ibis.NamedStructR\x0btableSchema\x120\n\x02op\x18\x04 \x01(\x0e2 .substrait.ibis.WriteRel.WriteOpR\x02op\x12)\n\x05input\x18\x05 \x01(\x0b2\x13.substrait.ibis.RelR\x05input\x12;\n\x06output\x18\x06 \x01(\x0e2#.substrait.ibis.WriteRel.OutputModeR\x06output"u\n\x07WriteOp\x12\x18\n\x14WRITE_OP_UNSPECIFIED\x10\x00\x12\x13\n\x0fWRITE_OP_INSERT\x10\x01\x12\x13\n\x0fWRITE_OP_DELETE\x10\x02\x12\x13\n\x0fWRITE_OP_UPDATE\x10\x03\x12\x11\n\rWRITE_OP_CTAS\x10\x04"e\n\nOutputMode\x12\x1b\n\x17OUTPUT_MODE_UNSPECIFIED\x10\x00\x12\x19\n\x15OUTPUT_MODE_NO_OUTPUT\x10\x01\x12\x1f\n\x1bOUTPUT_MODE_MODIFIED_TUPLES\x10\x02B\x0c\n\nwrite_type"\xe4\x05\n\x0bHashJoinRel\x121\n\x06common\x18\x01 \x01(\x0b2\x19.substrait.ibis.RelCommonR\x06common\x12\'\n\x04left\x18\x02 \x01(\x0b2\x13.substrait.ibis.RelR\x04left\x12)\n\x05right\x18\x03 \x01(\x0b2\x13.substrait.ibis.RelR\x05right\x12F\n\tleft_keys\x18\x04 \x03(\x0b2).substrait.ibis.Expression.FieldReferenceR\x08leftKeys\x12H\n\nright_keys\x18\x05 \x03(\x0b2).substrait.ibis.Expression.FieldReferenceR\trightKeys\x12D\n\x10post_join_filter\x18\x06 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x0epostJoinFilter\x128\n\x04type\x18\x07 \x01(\x0e2$.substrait.ibis.HashJoinRel.JoinTypeR\x04type\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension"\xde\x01\n\x08JoinType\x12\x19\n\x15JOIN_TYPE_UNSPECIFIED\x10\x00\x12\x13\n\x0fJOIN_TYPE_INNER\x10\x01\x12\x13\n\x0fJOIN_TYPE_OUTER\x10\x02\x12\x12\n\x0eJOIN_TYPE_LEFT\x10\x03\x12\x13\n\x0fJOIN_TYPE_RIGHT\x10\x04\x12\x17\n\x13JOIN_TYPE_LEFT_SEMI\x10\x05\x12\x18\n\x14JOIN_TYPE_RIGHT_SEMI\x10\x06\x12\x17\n\x13JOIN_TYPE_LEFT_ANTI\x10\x07\x12\x18\n\x14JOIN_TYPE_RIGHT_ANTI\x10\x08"\xe6\x05\n\x0cMergeJoinRel\x121\n\x06common\x18\x01 \x01(\x0b2\x19.substrait.ibis.RelCommonR\x06common\x12\'\n\x04left\x18\x02 \x01(\x0b2\x13.substrait.ibis.RelR\x04left\x12)\n\x05right\x18\x03 \x01(\x0b2\x13.substrait.ibis.RelR\x05right\x12F\n\tleft_keys\x18\x04 \x03(\x0b2).substrait.ibis.Expression.FieldReferenceR\x08leftKeys\x12H\n\nright_keys\x18\x05 \x03(\x0b2).substrait.ibis.Expression.FieldReferenceR\trightKeys\x12D\n\x10post_join_filter\x18\x06 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x0epostJoinFilter\x129\n\x04type\x18\x07 \x01(\x0e2%.substrait.ibis.MergeJoinRel.JoinTypeR\x04type\x12[\n\x12advanced_extension\x18\n \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x11advancedExtension"\xde\x01\n\x08JoinType\x12\x19\n\x15JOIN_TYPE_UNSPECIFIED\x10\x00\x12\x13\n\x0fJOIN_TYPE_INNER\x10\x01\x12\x13\n\x0fJOIN_TYPE_OUTER\x10\x02\x12\x12\n\x0eJOIN_TYPE_LEFT\x10\x03\x12\x13\n\x0fJOIN_TYPE_RIGHT\x10\x04\x12\x17\n\x13JOIN_TYPE_LEFT_SEMI\x10\x05\x12\x18\n\x14JOIN_TYPE_RIGHT_SEMI\x10\x06\x12\x17\n\x13JOIN_TYPE_LEFT_ANTI\x10\x07\x12\x18\n\x14JOIN_TYPE_RIGHT_ANTI\x10\x08"\x94\x01\n\x10FunctionArgument\x12\x14\n\x04enum\x18\x01 \x01(\tH\x00R\x04enum\x12*\n\x04type\x18\x02 \x01(\x0b2\x14.substrait.ibis.TypeH\x00R\x04type\x122\n\x05value\x18\x03 \x01(\x0b2\x1a.substrait.ibis.ExpressionH\x00R\x05valueB\n\n\x08arg_type"D\n\x0eFunctionOption\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1e\n\npreference\x18\x02 \x03(\tR\npreference"\xf7V\n\nExpression\x12>\n\x07literal\x18\x01 \x01(\x0b2".substrait.ibis.Expression.LiteralH\x00R\x07literal\x12I\n\tselection\x18\x02 \x01(\x0b2).substrait.ibis.Expression.FieldReferenceH\x00R\tselection\x12T\n\x0fscalar_function\x18\x03 \x01(\x0b2).substrait.ibis.Expression.ScalarFunctionH\x00R\x0escalarFunction\x12T\n\x0fwindow_function\x18\x05 \x01(\x0b2).substrait.ibis.Expression.WindowFunctionH\x00R\x0ewindowFunction\x12<\n\x07if_then\x18\x06 \x01(\x0b2!.substrait.ibis.Expression.IfThenH\x00R\x06ifThen\x12Z\n\x11switch_expression\x18\x07 \x01(\x0b2+.substrait.ibis.Expression.SwitchExpressionH\x00R\x10switchExpression\x12U\n\x10singular_or_list\x18\x08 \x01(\x0b2).substrait.ibis.Expression.SingularOrListH\x00R\x0esingularOrList\x12L\n\rmulti_or_list\x18\t \x01(\x0b2&.substrait.ibis.Expression.MultiOrListH\x00R\x0bmultiOrList\x125\n\x04cast\x18\x0b \x01(\x0b2\x1f.substrait.ibis.Expression.CastH\x00R\x04cast\x12A\n\x08subquery\x18\x0c \x01(\x0b2#.substrait.ibis.Expression.SubqueryH\x00R\x08subquery\x12;\n\x06nested\x18\r \x01(\x0b2!.substrait.ibis.Expression.NestedH\x00R\x06nested\x129\n\x04enum\x18\n \x01(\x0b2\x1f.substrait.ibis.Expression.EnumB\x02\x18\x01H\x00R\x04enum\x1a\x8f\x01\n\x04Enum\x12\x1e\n\tspecified\x18\x01 \x01(\tH\x00R\tspecified\x12I\n\x0bunspecified\x18\x02 \x01(\x0b2%.substrait.ibis.Expression.Enum.EmptyH\x00R\x0bunspecified\x1a\x0b\n\x05Empty:\x02\x18\x01:\x02\x18\x01B\x0b\n\tenum_kind\x1a\xf1\x10\n\x07Literal\x12\x1a\n\x07boolean\x18\x01 \x01(\x08H\x00R\x07boolean\x12\x10\n\x02i8\x18\x02 \x01(\x05H\x00R\x02i8\x12\x12\n\x03i16\x18\x03 \x01(\x05H\x00R\x03i16\x12\x12\n\x03i32\x18\x05 \x01(\x05H\x00R\x03i32\x12\x12\n\x03i64\x18\x07 \x01(\x03H\x00R\x03i64\x12\x14\n\x04fp32\x18\n \x01(\x02H\x00R\x04fp32\x12\x14\n\x04fp64\x18\x0b \x01(\x01H\x00R\x04fp64\x12\x18\n\x06string\x18\x0c \x01(\tH\x00R\x06string\x12\x18\n\x06binary\x18\r \x01(\x0cH\x00R\x06binary\x12\x1e\n\ttimestamp\x18\x0e \x01(\x03H\x00R\ttimestamp\x12\x14\n\x04date\x18\x10 \x01(\x05H\x00R\x04date\x12\x14\n\x04time\x18\x11 \x01(\x03H\x00R\x04time\x12m\n\x16interval_year_to_month\x18\x13 \x01(\x0b26.substrait.ibis.Expression.Literal.IntervalYearToMonthH\x00R\x13intervalYearToMonth\x12m\n\x16interval_day_to_second\x18\x14 \x01(\x0b26.substrait.ibis.Expression.Literal.IntervalDayToSecondH\x00R\x13intervalDayToSecond\x12\x1f\n\nfixed_char\x18\x15 \x01(\tH\x00R\tfixedChar\x12G\n\x08var_char\x18\x16 \x01(\x0b2*.substrait.ibis.Expression.Literal.VarCharH\x00R\x07varChar\x12#\n\x0cfixed_binary\x18\x17 \x01(\x0cH\x00R\x0bfixedBinary\x12F\n\x07decimal\x18\x18 \x01(\x0b2*.substrait.ibis.Expression.Literal.DecimalH\x00R\x07decimal\x12C\n\x06struct\x18\x19 \x01(\x0b2).substrait.ibis.Expression.Literal.StructH\x00R\x06struct\x12:\n\x03map\x18\x1a \x01(\x0b2&.substrait.ibis.Expression.Literal.MapH\x00R\x03map\x12#\n\x0ctimestamp_tz\x18\x1b \x01(\x03H\x00R\x0btimestampTz\x12\x14\n\x04uuid\x18\x1c \x01(\x0cH\x00R\x04uuid\x12*\n\x04null\x18\x1d \x01(\x0b2\x14.substrait.ibis.TypeH\x00R\x04null\x12=\n\x04list\x18\x1e \x01(\x0b2\'.substrait.ibis.Expression.Literal.ListH\x00R\x04list\x12:\n\nempty_list\x18\x1f \x01(\x0b2\x19.substrait.ibis.Type.ListH\x00R\temptyList\x127\n\tempty_map\x18  \x01(\x0b2\x18.substrait.ibis.Type.MapH\x00R\x08emptyMap\x12S\n\x0cuser_defined\x18! \x01(\x0b2..substrait.ibis.Expression.Literal.UserDefinedH\x00R\x0buserDefined\x12\x1a\n\x08nullable\x182 \x01(\x08R\x08nullable\x128\n\x18type_variation_reference\x183 \x01(\rR\x16typeVariationReference\x1a7\n\x07VarChar\x12\x14\n\x05value\x18\x01 \x01(\tR\x05value\x12\x16\n\x06length\x18\x02 \x01(\rR\x06length\x1aS\n\x07Decimal\x12\x14\n\x05value\x18\x01 \x01(\x0cR\x05value\x12\x1c\n\tprecision\x18\x02 \x01(\x05R\tprecision\x12\x14\n\x05scale\x18\x03 \x01(\x05R\x05scale\x1a\xd1\x01\n\x03Map\x12N\n\nkey_values\x18\x01 \x03(\x0b2/.substrait.ibis.Expression.Literal.Map.KeyValueR\tkeyValues\x1az\n\x08KeyValue\x124\n\x03key\x18\x01 \x01(\x0b2".substrait.ibis.Expression.LiteralR\x03key\x128\n\x05value\x18\x02 \x01(\x0b2".substrait.ibis.Expression.LiteralR\x05value\x1aC\n\x13IntervalYearToMonth\x12\x14\n\x05years\x18\x01 \x01(\x05R\x05years\x12\x16\n\x06months\x18\x02 \x01(\x05R\x06months\x1ag\n\x13IntervalDayToSecond\x12\x12\n\x04days\x18\x01 \x01(\x05R\x04days\x12\x18\n\x07seconds\x18\x02 \x01(\x05R\x07seconds\x12"\n\x0cmicroseconds\x18\x03 \x01(\x05R\x0cmicroseconds\x1aD\n\x06Struct\x12:\n\x06fields\x18\x01 \x03(\x0b2".substrait.ibis.Expression.LiteralR\x06fields\x1aB\n\x04List\x12:\n\x06values\x18\x01 \x03(\x0b2".substrait.ibis.Expression.LiteralR\x06values\x1a\xa9\x01\n\x0bUserDefined\x12%\n\x0etype_reference\x18\x01 \x01(\rR\rtypeReference\x12G\n\x0ftype_parameters\x18\x03 \x03(\x0b2\x1e.substrait.ibis.Type.ParameterR\x0etypeParameters\x12*\n\x05value\x18\x02 \x01(\x0b2\x14.google.protobuf.AnyR\x05valueB\x0e\n\x0cliteral_type\x1a\xe7\x04\n\x06Nested\x12\x1a\n\x08nullable\x18\x01 \x01(\x08R\x08nullable\x128\n\x18type_variation_reference\x18\x02 \x01(\rR\x16typeVariationReference\x12B\n\x06struct\x18\x03 \x01(\x0b2(.substrait.ibis.Expression.Nested.StructH\x00R\x06struct\x12<\n\x04list\x18\x04 \x01(\x0b2&.substrait.ibis.Expression.Nested.ListH\x00R\x04list\x129\n\x03map\x18\x05 \x01(\x0b2%.substrait.ibis.Expression.Nested.MapH\x00R\x03map\x1a\xc0\x01\n\x03Map\x12M\n\nkey_values\x18\x01 \x03(\x0b2..substrait.ibis.Expression.Nested.Map.KeyValueR\tkeyValues\x1aj\n\x08KeyValue\x12,\n\x03key\x18\x01 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x03key\x120\n\x05value\x18\x02 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x05value\x1a<\n\x06Struct\x122\n\x06fields\x18\x01 \x03(\x0b2\x1a.substrait.ibis.ExpressionR\x06fields\x1a:\n\x04List\x122\n\x06values\x18\x01 \x03(\x0b2\x1a.substrait.ibis.ExpressionR\x06valuesB\r\n\x0bnested_type\x1a\xa4\x02\n\x0eScalarFunction\x12-\n\x12function_reference\x18\x01 \x01(\rR\x11functionReference\x12>\n\targuments\x18\x04 \x03(\x0b2 .substrait.ibis.FunctionArgumentR\targuments\x128\n\x07options\x18\x05 \x03(\x0b2\x1e.substrait.ibis.FunctionOptionR\x07options\x125\n\x0boutput_type\x18\x03 \x01(\x0b2\x14.substrait.ibis.TypeR\noutputType\x122\n\x04args\x18\x02 \x03(\x0b2\x1a.substrait.ibis.ExpressionB\x02\x18\x01R\x04args\x1a\xad\t\n\x0eWindowFunction\x12-\n\x12function_reference\x18\x01 \x01(\rR\x11functionReference\x12>\n\targuments\x18\t \x03(\x0b2 .substrait.ibis.FunctionArgumentR\targuments\x128\n\x07options\x18\x0b \x03(\x0b2\x1e.substrait.ibis.FunctionOptionR\x07options\x125\n\x0boutput_type\x18\x07 \x01(\x0b2\x14.substrait.ibis.TypeR\noutputType\x126\n\x05phase\x18\x06 \x01(\x0e2 .substrait.ibis.AggregationPhaseR\x05phase\x12/\n\x05sorts\x18\x03 \x03(\x0b2\x19.substrait.ibis.SortFieldR\x05sorts\x12W\n\ninvocation\x18\n \x01(\x0e27.substrait.ibis.AggregateFunction.AggregationInvocationR\ninvocation\x12:\n\npartitions\x18\x02 \x03(\x0b2\x1a.substrait.ibis.ExpressionR\npartitions\x12P\n\x0blower_bound\x18\x05 \x01(\x0b2/.substrait.ibis.Expression.WindowFunction.BoundR\nlowerBound\x12P\n\x0bupper_bound\x18\x04 \x01(\x0b2/.substrait.ibis.Expression.WindowFunction.BoundR\nupperBound\x122\n\x04args\x18\x08 \x03(\x0b2\x1a.substrait.ibis.ExpressionB\x02\x18\x01R\x04args\x1a\xe4\x03\n\x05Bound\x12Y\n\tpreceding\x18\x01 \x01(\x0b29.substrait.ibis.Expression.WindowFunction.Bound.PrecedingH\x00R\tpreceding\x12Y\n\tfollowing\x18\x02 \x01(\x0b29.substrait.ibis.Expression.WindowFunction.Bound.FollowingH\x00R\tfollowing\x12]\n\x0bcurrent_row\x18\x03 \x01(\x0b2:.substrait.ibis.Expression.WindowFunction.Bound.CurrentRowH\x00R\ncurrentRow\x12Y\n\tunbounded\x18\x04 \x01(\x0b29.substrait.ibis.Expression.WindowFunction.Bound.UnboundedH\x00R\tunbounded\x1a#\n\tPreceding\x12\x16\n\x06offset\x18\x01 \x01(\x03R\x06offset\x1a#\n\tFollowing\x12\x16\n\x06offset\x18\x01 \x01(\x03R\x06offset\x1a\x0c\n\nCurrentRow\x1a\x0b\n\tUnboundedB\x06\n\x04kind\x1a\xde\x01\n\x06IfThen\x12<\n\x03ifs\x18\x01 \x03(\x0b2*.substrait.ibis.Expression.IfThen.IfClauseR\x03ifs\x12.\n\x04else\x18\x02 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x04else\x1af\n\x08IfClause\x12*\n\x02if\x18\x01 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x02if\x12.\n\x04then\x18\x02 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x04then\x1a\xbb\x02\n\x04Cast\x12(\n\x04type\x18\x01 \x01(\x0b2\x14.substrait.ibis.TypeR\x04type\x120\n\x05input\x18\x02 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x05input\x12Z\n\x10failure_behavior\x18\x03 \x01(\x0e2/.substrait.ibis.Expression.Cast.FailureBehaviorR\x0ffailureBehavior"{\n\x0fFailureBehavior\x12 \n\x1cFAILURE_BEHAVIOR_UNSPECIFIED\x10\x00\x12 \n\x1cFAILURE_BEHAVIOR_RETURN_NULL\x10\x01\x12$\n FAILURE_BEHAVIOR_THROW_EXCEPTION\x10\x02\x1a\xaa\x02\n\x10SwitchExpression\x120\n\x05match\x18\x03 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x05match\x12E\n\x03ifs\x18\x01 \x03(\x0b23.substrait.ibis.Expression.SwitchExpression.IfValueR\x03ifs\x12.\n\x04else\x18\x02 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x04else\x1am\n\x07IfValue\x122\n\x02if\x18\x01 \x01(\x0b2".substrait.ibis.Expression.LiteralR\x02if\x12.\n\x04then\x18\x02 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x04then\x1ax\n\x0eSingularOrList\x120\n\x05value\x18\x01 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x05value\x124\n\x07options\x18\x02 \x03(\x0b2\x1a.substrait.ibis.ExpressionR\x07options\x1a\xc6\x01\n\x0bMultiOrList\x120\n\x05value\x18\x01 \x03(\x0b2\x1a.substrait.ibis.ExpressionR\x05value\x12G\n\x07options\x18\x02 \x03(\x0b2-.substrait.ibis.Expression.MultiOrList.RecordR\x07options\x1a<\n\x06Record\x122\n\x06fields\x18\x01 \x03(\x0b2\x1a.substrait.ibis.ExpressionR\x06fields\x1a\xa7\x04\n\x10EmbeddedFunction\x128\n\targuments\x18\x01 \x03(\x0b2\x1a.substrait.ibis.ExpressionR\targuments\x125\n\x0boutput_type\x18\x02 \x01(\x0b2\x14.substrait.ibis.TypeR\noutputType\x12x\n\x16python_pickle_function\x18\x03 \x01(\x0b2@.substrait.ibis.Expression.EmbeddedFunction.PythonPickleFunctionH\x00R\x14pythonPickleFunction\x12u\n\x15web_assembly_function\x18\x04 \x01(\x0b2?.substrait.ibis.Expression.EmbeddedFunction.WebAssemblyFunctionH\x00R\x13webAssemblyFunction\x1aV\n\x14PythonPickleFunction\x12\x1a\n\x08function\x18\x01 \x01(\x0cR\x08function\x12"\n\x0cprerequisite\x18\x02 \x03(\tR\x0cprerequisite\x1aQ\n\x13WebAssemblyFunction\x12\x16\n\x06script\x18\x01 \x01(\x0cR\x06script\x12"\n\x0cprerequisite\x18\x02 \x03(\tR\x0cprerequisiteB\x06\n\x04kind\x1a\x8c\x05\n\x10ReferenceSegment\x12M\n\x07map_key\x18\x01 \x01(\x0b22.substrait.ibis.Expression.ReferenceSegment.MapKeyH\x00R\x06mapKey\x12\\\n\x0cstruct_field\x18\x02 \x01(\x0b27.substrait.ibis.Expression.ReferenceSegment.StructFieldH\x00R\x0bstructField\x12\\\n\x0clist_element\x18\x03 \x01(\x0b27.substrait.ibis.Expression.ReferenceSegment.ListElementH\x00R\x0blistElement\x1a\x88\x01\n\x06MapKey\x12;\n\x07map_key\x18\x01 \x01(\x0b2".substrait.ibis.Expression.LiteralR\x06mapKey\x12A\n\x05child\x18\x02 \x01(\x0b2+.substrait.ibis.Expression.ReferenceSegmentR\x05child\x1af\n\x0bStructField\x12\x14\n\x05field\x18\x01 \x01(\x05R\x05field\x12A\n\x05child\x18\x02 \x01(\x0b2+.substrait.ibis.Expression.ReferenceSegmentR\x05child\x1ah\n\x0bListElement\x12\x16\n\x06offset\x18\x01 \x01(\x05R\x06offset\x12A\n\x05child\x18\x02 \x01(\x0b2+.substrait.ibis.Expression.ReferenceSegmentR\x05childB\x10\n\x0ereference_type\x1a\xe3\x0b\n\x0eMaskExpression\x12N\n\x06select\x18\x01 \x01(\x0b26.substrait.ibis.Expression.MaskExpression.StructSelectR\x06select\x128\n\x18maintain_singular_struct\x18\x02 \x01(\x08R\x16maintainSingularStruct\x1a\xf7\x01\n\x06Select\x12P\n\x06struct\x18\x01 \x01(\x0b26.substrait.ibis.Expression.MaskExpression.StructSelectH\x00R\x06struct\x12J\n\x04list\x18\x02 \x01(\x0b24.substrait.ibis.Expression.MaskExpression.ListSelectH\x00R\x04list\x12G\n\x03map\x18\x03 \x01(\x0b23.substrait.ibis.Expression.MaskExpression.MapSelectH\x00R\x03mapB\x06\n\x04type\x1ag\n\x0cStructSelect\x12W\n\x0cstruct_items\x18\x01 \x03(\x0b24.substrait.ibis.Expression.MaskExpression.StructItemR\x0bstructItems\x1aj\n\nStructItem\x12\x14\n\x05field\x18\x01 \x01(\x05R\x05field\x12F\n\x05child\x18\x02 \x01(\x0b20.substrait.ibis.Expression.MaskExpression.SelectR\x05child\x1a\xfa\x03\n\nListSelect\x12a\n\tselection\x18\x01 \x03(\x0b2C.substrait.ibis.Expression.MaskExpression.ListSelect.ListSelectItemR\tselection\x12F\n\x05child\x18\x02 \x01(\x0b20.substrait.ibis.Expression.MaskExpression.SelectR\x05child\x1a\xc0\x02\n\x0eListSelectItem\x12e\n\x04item\x18\x01 \x01(\x0b2O.substrait.ibis.Expression.MaskExpression.ListSelect.ListSelectItem.ListElementH\x00R\x04item\x12e\n\x05slice\x18\x02 \x01(\x0b2M.substrait.ibis.Expression.MaskExpression.ListSelect.ListSelectItem.ListSliceH\x00R\x05slice\x1a#\n\x0bListElement\x12\x14\n\x05field\x18\x01 \x01(\x05R\x05field\x1a3\n\tListSlice\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03end\x18\x02 \x01(\x05R\x03endB\x06\n\x04type\x1a\xfa\x02\n\tMapSelect\x12N\n\x03key\x18\x01 \x01(\x0b2:.substrait.ibis.Expression.MaskExpression.MapSelect.MapKeyH\x00R\x03key\x12f\n\nexpression\x18\x02 \x01(\x0b2D.substrait.ibis.Expression.MaskExpression.MapSelect.MapKeyExpressionH\x00R\nexpression\x12F\n\x05child\x18\x03 \x01(\x0b20.substrait.ibis.Expression.MaskExpression.SelectR\x05child\x1a!\n\x06MapKey\x12\x17\n\x07map_key\x18\x01 \x01(\tR\x06mapKey\x1a@\n\x10MapKeyExpression\x12,\n\x12map_key_expression\x18\x01 \x01(\tR\x10mapKeyExpressionB\x08\n\x06select\x1a\xa6\x04\n\x0eFieldReference\x12X\n\x10direct_reference\x18\x01 \x01(\x0b2+.substrait.ibis.Expression.ReferenceSegmentH\x00R\x0fdirectReference\x12V\n\x10masked_reference\x18\x02 \x01(\x0b2).substrait.ibis.Expression.MaskExpressionH\x00R\x0fmaskedReference\x12<\n\nexpression\x18\x03 \x01(\x0b2\x1a.substrait.ibis.ExpressionH\x01R\nexpression\x12`\n\x0eroot_reference\x18\x04 \x01(\x0b27.substrait.ibis.Expression.FieldReference.RootReferenceH\x01R\rrootReference\x12c\n\x0fouter_reference\x18\x05 \x01(\x0b28.substrait.ibis.Expression.FieldReference.OuterReferenceH\x01R\x0eouterReference\x1a\x0f\n\rRootReference\x1a-\n\x0eOuterReference\x12\x1b\n\tsteps_out\x18\x01 \x01(\rR\x08stepsOutB\x10\n\x0ereference_typeB\x0b\n\troot_type\x1a\xd6\n\n\x08Subquery\x12D\n\x06scalar\x18\x01 \x01(\x0b2*.substrait.ibis.Expression.Subquery.ScalarH\x00R\x06scalar\x12T\n\x0cin_predicate\x18\x02 \x01(\x0b2/.substrait.ibis.Expression.Subquery.InPredicateH\x00R\x0binPredicate\x12W\n\rset_predicate\x18\x03 \x01(\x0b20.substrait.ibis.Expression.Subquery.SetPredicateH\x00R\x0csetPredicate\x12Z\n\x0eset_comparison\x18\x04 \x01(\x0b21.substrait.ibis.Expression.Subquery.SetComparisonH\x00R\rsetComparison\x1a3\n\x06Scalar\x12)\n\x05input\x18\x01 \x01(\x0b2\x13.substrait.ibis.RelR\x05input\x1at\n\x0bInPredicate\x124\n\x07needles\x18\x01 \x03(\x0b2\x1a.substrait.ibis.ExpressionR\x07needles\x12/\n\x08haystack\x18\x02 \x01(\x0b2\x13.substrait.ibis.RelR\x08haystack\x1a\xfb\x01\n\x0cSetPredicate\x12_\n\x0cpredicate_op\x18\x01 \x01(\x0e2<.substrait.ibis.Expression.Subquery.SetPredicate.PredicateOpR\x0bpredicateOp\x12+\n\x06tuples\x18\x02 \x01(\x0b2\x13.substrait.ibis.RelR\x06tuples"]\n\x0bPredicateOp\x12\x1c\n\x18PREDICATE_OP_UNSPECIFIED\x10\x00\x12\x17\n\x13PREDICATE_OP_EXISTS\x10\x01\x12\x17\n\x13PREDICATE_OP_UNIQUE\x10\x02\x1a\xbe\x04\n\rSetComparison\x12`\n\x0creduction_op\x18\x01 \x01(\x0e2=.substrait.ibis.Expression.Subquery.SetComparison.ReductionOpR\x0breductionOp\x12c\n\rcomparison_op\x18\x02 \x01(\x0e2>.substrait.ibis.Expression.Subquery.SetComparison.ComparisonOpR\x0ccomparisonOp\x12.\n\x04left\x18\x03 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x04left\x12)\n\x05right\x18\x04 \x01(\x0b2\x13.substrait.ibis.RelR\x05right"\xb1\x01\n\x0cComparisonOp\x12\x1d\n\x19COMPARISON_OP_UNSPECIFIED\x10\x00\x12\x14\n\x10COMPARISON_OP_EQ\x10\x01\x12\x14\n\x10COMPARISON_OP_NE\x10\x02\x12\x14\n\x10COMPARISON_OP_LT\x10\x03\x12\x14\n\x10COMPARISON_OP_GT\x10\x04\x12\x14\n\x10COMPARISON_OP_LE\x10\x05\x12\x14\n\x10COMPARISON_OP_GE\x10\x06"W\n\x0bReductionOp\x12\x1c\n\x18REDUCTION_OP_UNSPECIFIED\x10\x00\x12\x14\n\x10REDUCTION_OP_ANY\x10\x01\x12\x14\n\x10REDUCTION_OP_ALL\x10\x02B\x0f\n\rsubquery_typeB\n\n\x08rex_type"\xb7\x03\n\tSortField\x12.\n\x04expr\x18\x01 \x01(\x0b2\x1a.substrait.ibis.ExpressionR\x04expr\x12G\n\tdirection\x18\x02 \x01(\x0e2\'.substrait.ibis.SortField.SortDirectionH\x00R\tdirection\x12D\n\x1dcomparison_function_reference\x18\x03 \x01(\rH\x00R\x1bcomparisonFunctionReference"\xdd\x01\n\rSortDirection\x12\x1e\n\x1aSORT_DIRECTION_UNSPECIFIED\x10\x00\x12"\n\x1eSORT_DIRECTION_ASC_NULLS_FIRST\x10\x01\x12!\n\x1dSORT_DIRECTION_ASC_NULLS_LAST\x10\x02\x12#\n\x1fSORT_DIRECTION_DESC_NULLS_FIRST\x10\x03\x12"\n\x1eSORT_DIRECTION_DESC_NULLS_LAST\x10\x04\x12\x1c\n\x18SORT_DIRECTION_CLUSTERED\x10\x05B\x0b\n\tsort_kind"\xa9\x05\n\x11AggregateFunction\x12-\n\x12function_reference\x18\x01 \x01(\rR\x11functionReference\x12>\n\targuments\x18\x07 \x03(\x0b2 .substrait.ibis.FunctionArgumentR\targuments\x128\n\x07options\x18\x08 \x03(\x0b2\x1e.substrait.ibis.FunctionOptionR\x07options\x125\n\x0boutput_type\x18\x05 \x01(\x0b2\x14.substrait.ibis.TypeR\noutputType\x126\n\x05phase\x18\x04 \x01(\x0e2 .substrait.ibis.AggregationPhaseR\x05phase\x12/\n\x05sorts\x18\x03 \x03(\x0b2\x19.substrait.ibis.SortFieldR\x05sorts\x12W\n\ninvocation\x18\x06 \x01(\x0e27.substrait.ibis.AggregateFunction.AggregationInvocationR\ninvocation\x122\n\x04args\x18\x02 \x03(\x0b2\x1a.substrait.ibis.ExpressionB\x02\x18\x01R\x04args\x1a7\n\x0cReferenceRel\x12\'\n\x0fsubtree_ordinal\x18\x01 \x01(\x05R\x0esubtreeOrdinal"\x84\x01\n\x15AggregationInvocation\x12&\n"AGGREGATION_INVOCATION_UNSPECIFIED\x10\x00\x12\x1e\n\x1aAGGREGATION_INVOCATION_ALL\x10\x01\x12#\n\x1fAGGREGATION_INVOCATION_DISTINCT\x10\x02*\xef\x01\n\x10AggregationPhase\x12!\n\x1dAGGREGATION_PHASE_UNSPECIFIED\x10\x00\x12-\n)AGGREGATION_PHASE_INITIAL_TO_INTERMEDIATE\x10\x01\x122\n.AGGREGATION_PHASE_INTERMEDIATE_TO_INTERMEDIATE\x10\x02\x12\'\n#AGGREGATION_PHASE_INITIAL_TO_RESULT\x10\x03\x12,\n(AGGREGATION_PHASE_INTERMEDIATE_TO_RESULT\x10\x04B5\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobufb\x06proto3')
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'substrait.ibis.algebra_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-    DESCRIPTOR._options = None
-    DESCRIPTOR._serialized_options = b'\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobuf'
-    _EXPRESSION_ENUM_EMPTY._options = None
-    _EXPRESSION_ENUM_EMPTY._serialized_options = b'\x18\x01'
-    _EXPRESSION_ENUM._options = None
-    _EXPRESSION_ENUM._serialized_options = b'\x18\x01'
-    _EXPRESSION_SCALARFUNCTION.fields_by_name['args']._options = None
-    _EXPRESSION_SCALARFUNCTION.fields_by_name['args']._serialized_options = b'\x18\x01'
-    _EXPRESSION_WINDOWFUNCTION.fields_by_name['args']._options = None
-    _EXPRESSION_WINDOWFUNCTION.fields_by_name['args']._serialized_options = b'\x18\x01'
-    _EXPRESSION.fields_by_name['enum']._options = None
-    _EXPRESSION.fields_by_name['enum']._serialized_options = b'\x18\x01'
-    _AGGREGATEFUNCTION.fields_by_name['args']._options = None
-    _AGGREGATEFUNCTION.fields_by_name['args']._serialized_options = b'\x18\x01'
-    _AGGREGATIONPHASE._serialized_start = 23917
-    _AGGREGATIONPHASE._serialized_end = 24156
-    _RELCOMMON._serialized_start = 147
-    _RELCOMMON._serialized_end = 1010
-    _RELCOMMON_DIRECT._serialized_start = 419
-    _RELCOMMON_DIRECT._serialized_end = 427
-    _RELCOMMON_EMIT._serialized_start = 429
-    _RELCOMMON_EMIT._serialized_end = 474
-    _RELCOMMON_HINT._serialized_start = 477
-    _RELCOMMON_HINT._serialized_end = 997
-    _RELCOMMON_HINT_STATS._serialized_start = 721
-    _RELCOMMON_HINT_STATS._serialized_end = 883
-    _RELCOMMON_HINT_RUNTIMECONSTRAINT._serialized_start = 885
-    _RELCOMMON_HINT_RUNTIMECONSTRAINT._serialized_end = 997
-    _READREL._serialized_start = 1013
-    _READREL._serialized_end = 2958
-    _READREL_NAMEDTABLE._serialized_start = 1733
-    _READREL_NAMEDTABLE._serialized_end = 1860
-    _READREL_VIRTUALTABLE._serialized_start = 1862
-    _READREL_VIRTUALTABLE._serialized_end = 1943
-    _READREL_EXTENSIONTABLE._serialized_start = 1945
-    _READREL_EXTENSIONTABLE._serialized_end = 2007
-    _READREL_LOCALFILES._serialized_start = 2010
-    _READREL_LOCALFILES._serialized_end = 2945
-    _READREL_LOCALFILES_FILEORFILES._serialized_start = 2188
-    _READREL_LOCALFILES_FILEORFILES._serialized_end = 2945
-    _READREL_LOCALFILES_FILEORFILES_PARQUETREADOPTIONS._serialized_start = 2826
-    _READREL_LOCALFILES_FILEORFILES_PARQUETREADOPTIONS._serialized_end = 2846
-    _READREL_LOCALFILES_FILEORFILES_ARROWREADOPTIONS._serialized_start = 2848
-    _READREL_LOCALFILES_FILEORFILES_ARROWREADOPTIONS._serialized_end = 2866
-    _READREL_LOCALFILES_FILEORFILES_ORCREADOPTIONS._serialized_start = 2868
-    _READREL_LOCALFILES_FILEORFILES_ORCREADOPTIONS._serialized_end = 2884
-    _READREL_LOCALFILES_FILEORFILES_DWRFREADOPTIONS._serialized_start = 2886
-    _READREL_LOCALFILES_FILEORFILES_DWRFREADOPTIONS._serialized_end = 2903
-    _PROJECTREL._serialized_start = 2961
-    _PROJECTREL._serialized_end = 3222
-    _JOINREL._serialized_start = 3225
-    _JOINREL._serialized_end = 3831
-    _JOINREL_JOINTYPE._serialized_start = 3649
-    _JOINREL_JOINTYPE._serialized_end = 3831
-    _CROSSREL._serialized_start = 3834
-    _CROSSREL._serialized_end = 4072
-    _FETCHREL._serialized_start = 4075
-    _FETCHREL._serialized_end = 4318
-    _AGGREGATEREL._serialized_start = 4321
-    _AGGREGATEREL._serialized_end = 4872
-    _AGGREGATEREL_GROUPING._serialized_start = 4659
-    _AGGREGATEREL_GROUPING._serialized_end = 4748
-    _AGGREGATEREL_MEASURE._serialized_start = 4750
-    _AGGREGATEREL_MEASURE._serialized_end = 4872
-    _SORTREL._serialized_start = 4875
-    _SORTREL._serialized_end = 5120
-    _FILTERREL._serialized_start = 5123
-    _FILTERREL._serialized_end = 5379
-    _SETREL._serialized_start = 5382
-    _SETREL._serialized_end = 5828
-    _SETREL_SETOP._serialized_start = 5628
-    _SETREL_SETOP._serialized_end = 5828
-    _EXTENSIONSINGLEREL._serialized_start = 5831
-    _EXTENSIONSINGLEREL._serialized_end = 5991
-    _EXTENSIONLEAFREL._serialized_start = 5993
-    _EXTENSIONLEAFREL._serialized_end = 6108
-    _EXTENSIONMULTIREL._serialized_start = 6111
-    _EXTENSIONMULTIREL._serialized_end = 6272
-    _EXCHANGEREL._serialized_start = 6275
-    _EXCHANGEREL._serialized_end = 7513
-    _EXCHANGEREL_SCATTERFIELDS._serialized_start = 7002
-    _EXCHANGEREL_SCATTERFIELDS._serialized_end = 7084
-    _EXCHANGEREL_SINGLEBUCKETEXPRESSION._serialized_start = 7086
-    _EXCHANGEREL_SINGLEBUCKETEXPRESSION._serialized_end = 7170
-    _EXCHANGEREL_MULTIBUCKETEXPRESSION._serialized_start = 7173
-    _EXCHANGEREL_MULTIBUCKETEXPRESSION._serialized_end = 7306
-    _EXCHANGEREL_BROADCAST._serialized_start = 7308
-    _EXCHANGEREL_BROADCAST._serialized_end = 7319
-    _EXCHANGEREL_ROUNDROBIN._serialized_start = 7321
-    _EXCHANGEREL_ROUNDROBIN._serialized_end = 7355
-    _EXCHANGEREL_EXCHANGETARGET._serialized_start = 7358
-    _EXCHANGEREL_EXCHANGETARGET._serialized_end = 7496
-    _RELROOT._serialized_start = 7515
-    _RELROOT._serialized_end = 7589
-    _REL._serialized_start = 7592
-    _REL._serialized_end = 8422
-    _NAMEDOBJECTWRITE._serialized_start = 8425
-    _NAMEDOBJECTWRITE._serialized_end = 8558
-    _EXTENSIONOBJECT._serialized_start = 8560
-    _EXTENSIONOBJECT._serialized_end = 8623
-    _DDLREL._serialized_start = 8626
-    _DDLREL._serialized_end = 9337
-    _DDLREL_DDLOBJECT._serialized_start = 9097
-    _DDLREL_DDLOBJECT._serialized_end = 9179
-    _DDLREL_DDLOP._serialized_start = 9182
-    _DDLREL_DDLOP._serialized_end = 9323
-    _WRITEREL._serialized_start = 9340
-    _WRITEREL._serialized_end = 9949
-    _WRITEREL_WRITEOP._serialized_start = 9715
-    _WRITEREL_WRITEOP._serialized_end = 9832
-    _WRITEREL_OUTPUTMODE._serialized_start = 9834
-    _WRITEREL_OUTPUTMODE._serialized_end = 9935
-    _HASHJOINREL._serialized_start = 9952
-    _HASHJOINREL._serialized_end = 10692
-    _HASHJOINREL_JOINTYPE._serialized_start = 10470
-    _HASHJOINREL_JOINTYPE._serialized_end = 10692
-    _MERGEJOINREL._serialized_start = 10695
-    _MERGEJOINREL._serialized_end = 11437
-    _MERGEJOINREL_JOINTYPE._serialized_start = 10470
-    _MERGEJOINREL_JOINTYPE._serialized_end = 10692
-    _FUNCTIONARGUMENT._serialized_start = 11440
-    _FUNCTIONARGUMENT._serialized_end = 11588
-    _FUNCTIONOPTION._serialized_start = 11590
-    _FUNCTIONOPTION._serialized_end = 11658
-    _EXPRESSION._serialized_start = 11661
-    _EXPRESSION._serialized_end = 22788
-    _EXPRESSION_ENUM._serialized_start = 12548
-    _EXPRESSION_ENUM._serialized_end = 12691
-    _EXPRESSION_ENUM_EMPTY._serialized_start = 12663
-    _EXPRESSION_ENUM_EMPTY._serialized_end = 12674
-    _EXPRESSION_LITERAL._serialized_start = 12694
-    _EXPRESSION_LITERAL._serialized_end = 14855
-    _EXPRESSION_LITERAL_VARCHAR._serialized_start = 14003
-    _EXPRESSION_LITERAL_VARCHAR._serialized_end = 14058
-    _EXPRESSION_LITERAL_DECIMAL._serialized_start = 14060
-    _EXPRESSION_LITERAL_DECIMAL._serialized_end = 14143
-    _EXPRESSION_LITERAL_MAP._serialized_start = 14146
-    _EXPRESSION_LITERAL_MAP._serialized_end = 14355
-    _EXPRESSION_LITERAL_MAP_KEYVALUE._serialized_start = 14233
-    _EXPRESSION_LITERAL_MAP_KEYVALUE._serialized_end = 14355
-    _EXPRESSION_LITERAL_INTERVALYEARTOMONTH._serialized_start = 14357
-    _EXPRESSION_LITERAL_INTERVALYEARTOMONTH._serialized_end = 14424
-    _EXPRESSION_LITERAL_INTERVALDAYTOSECOND._serialized_start = 14426
-    _EXPRESSION_LITERAL_INTERVALDAYTOSECOND._serialized_end = 14529
-    _EXPRESSION_LITERAL_STRUCT._serialized_start = 14531
-    _EXPRESSION_LITERAL_STRUCT._serialized_end = 14599
-    _EXPRESSION_LITERAL_LIST._serialized_start = 14601
-    _EXPRESSION_LITERAL_LIST._serialized_end = 14667
-    _EXPRESSION_LITERAL_USERDEFINED._serialized_start = 14670
-    _EXPRESSION_LITERAL_USERDEFINED._serialized_end = 14839
-    _EXPRESSION_NESTED._serialized_start = 14858
-    _EXPRESSION_NESTED._serialized_end = 15473
-    _EXPRESSION_NESTED_MAP._serialized_start = 15144
-    _EXPRESSION_NESTED_MAP._serialized_end = 15336
-    _EXPRESSION_NESTED_MAP_KEYVALUE._serialized_start = 15230
-    _EXPRESSION_NESTED_MAP_KEYVALUE._serialized_end = 15336
-    _EXPRESSION_NESTED_STRUCT._serialized_start = 15338
-    _EXPRESSION_NESTED_STRUCT._serialized_end = 15398
-    _EXPRESSION_NESTED_LIST._serialized_start = 15400
-    _EXPRESSION_NESTED_LIST._serialized_end = 15458
-    _EXPRESSION_SCALARFUNCTION._serialized_start = 15476
-    _EXPRESSION_SCALARFUNCTION._serialized_end = 15768
-    _EXPRESSION_WINDOWFUNCTION._serialized_start = 15771
-    _EXPRESSION_WINDOWFUNCTION._serialized_end = 16968
-    _EXPRESSION_WINDOWFUNCTION_BOUND._serialized_start = 16484
-    _EXPRESSION_WINDOWFUNCTION_BOUND._serialized_end = 16968
-    _EXPRESSION_WINDOWFUNCTION_BOUND_PRECEDING._serialized_start = 16861
-    _EXPRESSION_WINDOWFUNCTION_BOUND_PRECEDING._serialized_end = 16896
-    _EXPRESSION_WINDOWFUNCTION_BOUND_FOLLOWING._serialized_start = 16898
-    _EXPRESSION_WINDOWFUNCTION_BOUND_FOLLOWING._serialized_end = 16933
-    _EXPRESSION_WINDOWFUNCTION_BOUND_CURRENTROW._serialized_start = 16935
-    _EXPRESSION_WINDOWFUNCTION_BOUND_CURRENTROW._serialized_end = 16947
-    _EXPRESSION_WINDOWFUNCTION_BOUND_UNBOUNDED._serialized_start = 16949
-    _EXPRESSION_WINDOWFUNCTION_BOUND_UNBOUNDED._serialized_end = 16960
-    _EXPRESSION_IFTHEN._serialized_start = 16971
-    _EXPRESSION_IFTHEN._serialized_end = 17193
-    _EXPRESSION_IFTHEN_IFCLAUSE._serialized_start = 17091
-    _EXPRESSION_IFTHEN_IFCLAUSE._serialized_end = 17193
-    _EXPRESSION_CAST._serialized_start = 17196
-    _EXPRESSION_CAST._serialized_end = 17511
-    _EXPRESSION_CAST_FAILUREBEHAVIOR._serialized_start = 17388
-    _EXPRESSION_CAST_FAILUREBEHAVIOR._serialized_end = 17511
-    _EXPRESSION_SWITCHEXPRESSION._serialized_start = 17514
-    _EXPRESSION_SWITCHEXPRESSION._serialized_end = 17812
-    _EXPRESSION_SWITCHEXPRESSION_IFVALUE._serialized_start = 17703
-    _EXPRESSION_SWITCHEXPRESSION_IFVALUE._serialized_end = 17812
-    _EXPRESSION_SINGULARORLIST._serialized_start = 17814
-    _EXPRESSION_SINGULARORLIST._serialized_end = 17934
-    _EXPRESSION_MULTIORLIST._serialized_start = 17937
-    _EXPRESSION_MULTIORLIST._serialized_end = 18135
-    _EXPRESSION_MULTIORLIST_RECORD._serialized_start = 18075
-    _EXPRESSION_MULTIORLIST_RECORD._serialized_end = 18135
-    _EXPRESSION_EMBEDDEDFUNCTION._serialized_start = 18138
-    _EXPRESSION_EMBEDDEDFUNCTION._serialized_end = 18689
-    _EXPRESSION_EMBEDDEDFUNCTION_PYTHONPICKLEFUNCTION._serialized_start = 18512
-    _EXPRESSION_EMBEDDEDFUNCTION_PYTHONPICKLEFUNCTION._serialized_end = 18598
-    _EXPRESSION_EMBEDDEDFUNCTION_WEBASSEMBLYFUNCTION._serialized_start = 18600
-    _EXPRESSION_EMBEDDEDFUNCTION_WEBASSEMBLYFUNCTION._serialized_end = 18681
-    _EXPRESSION_REFERENCESEGMENT._serialized_start = 18692
-    _EXPRESSION_REFERENCESEGMENT._serialized_end = 19344
-    _EXPRESSION_REFERENCESEGMENT_MAPKEY._serialized_start = 18980
-    _EXPRESSION_REFERENCESEGMENT_MAPKEY._serialized_end = 19116
-    _EXPRESSION_REFERENCESEGMENT_STRUCTFIELD._serialized_start = 19118
-    _EXPRESSION_REFERENCESEGMENT_STRUCTFIELD._serialized_end = 19220
-    _EXPRESSION_REFERENCESEGMENT_LISTELEMENT._serialized_start = 19222
-    _EXPRESSION_REFERENCESEGMENT_LISTELEMENT._serialized_end = 19326
-    _EXPRESSION_MASKEXPRESSION._serialized_start = 19347
-    _EXPRESSION_MASKEXPRESSION._serialized_end = 20854
-    _EXPRESSION_MASKEXPRESSION_SELECT._serialized_start = 19504
-    _EXPRESSION_MASKEXPRESSION_SELECT._serialized_end = 19751
-    _EXPRESSION_MASKEXPRESSION_STRUCTSELECT._serialized_start = 19753
-    _EXPRESSION_MASKEXPRESSION_STRUCTSELECT._serialized_end = 19856
-    _EXPRESSION_MASKEXPRESSION_STRUCTITEM._serialized_start = 19858
-    _EXPRESSION_MASKEXPRESSION_STRUCTITEM._serialized_end = 19964
-    _EXPRESSION_MASKEXPRESSION_LISTSELECT._serialized_start = 19967
-    _EXPRESSION_MASKEXPRESSION_LISTSELECT._serialized_end = 20473
-    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM._serialized_start = 20153
-    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM._serialized_end = 20473
-    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM_LISTELEMENT._serialized_start = 20377
-    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM_LISTELEMENT._serialized_end = 20412
-    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM_LISTSLICE._serialized_start = 20414
-    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM_LISTSLICE._serialized_end = 20465
-    _EXPRESSION_MASKEXPRESSION_MAPSELECT._serialized_start = 20476
-    _EXPRESSION_MASKEXPRESSION_MAPSELECT._serialized_end = 20854
-    _EXPRESSION_MASKEXPRESSION_MAPSELECT_MAPKEY._serialized_start = 20745
-    _EXPRESSION_MASKEXPRESSION_MAPSELECT_MAPKEY._serialized_end = 20778
-    _EXPRESSION_MASKEXPRESSION_MAPSELECT_MAPKEYEXPRESSION._serialized_start = 20780
-    _EXPRESSION_MASKEXPRESSION_MAPSELECT_MAPKEYEXPRESSION._serialized_end = 20844
-    _EXPRESSION_FIELDREFERENCE._serialized_start = 20857
-    _EXPRESSION_FIELDREFERENCE._serialized_end = 21407
-    _EXPRESSION_FIELDREFERENCE_ROOTREFERENCE._serialized_start = 21314
-    _EXPRESSION_FIELDREFERENCE_ROOTREFERENCE._serialized_end = 21329
-    _EXPRESSION_FIELDREFERENCE_OUTERREFERENCE._serialized_start = 21331
-    _EXPRESSION_FIELDREFERENCE_OUTERREFERENCE._serialized_end = 21376
-    _EXPRESSION_SUBQUERY._serialized_start = 21410
-    _EXPRESSION_SUBQUERY._serialized_end = 22776
-    _EXPRESSION_SUBQUERY_SCALAR._serialized_start = 21759
-    _EXPRESSION_SUBQUERY_SCALAR._serialized_end = 21810
-    _EXPRESSION_SUBQUERY_INPREDICATE._serialized_start = 21812
-    _EXPRESSION_SUBQUERY_INPREDICATE._serialized_end = 21928
-    _EXPRESSION_SUBQUERY_SETPREDICATE._serialized_start = 21931
-    _EXPRESSION_SUBQUERY_SETPREDICATE._serialized_end = 22182
-    _EXPRESSION_SUBQUERY_SETPREDICATE_PREDICATEOP._serialized_start = 22089
-    _EXPRESSION_SUBQUERY_SETPREDICATE_PREDICATEOP._serialized_end = 22182
-    _EXPRESSION_SUBQUERY_SETCOMPARISON._serialized_start = 22185
-    _EXPRESSION_SUBQUERY_SETCOMPARISON._serialized_end = 22759
-    _EXPRESSION_SUBQUERY_SETCOMPARISON_COMPARISONOP._serialized_start = 22493
-    _EXPRESSION_SUBQUERY_SETCOMPARISON_COMPARISONOP._serialized_end = 22670
-    _EXPRESSION_SUBQUERY_SETCOMPARISON_REDUCTIONOP._serialized_start = 22672
-    _EXPRESSION_SUBQUERY_SETCOMPARISON_REDUCTIONOP._serialized_end = 22759
-    _SORTFIELD._serialized_start = 22791
-    _SORTFIELD._serialized_end = 23230
-    _SORTFIELD_SORTDIRECTION._serialized_start = 22996
-    _SORTFIELD_SORTDIRECTION._serialized_end = 23217
-    _AGGREGATEFUNCTION._serialized_start = 23233
-    _AGGREGATEFUNCTION._serialized_end = 23914
-    _AGGREGATEFUNCTION_REFERENCEREL._serialized_start = 23724
-    _AGGREGATEFUNCTION_REFERENCEREL._serialized_end = 23779
-    _AGGREGATEFUNCTION_AGGREGATIONINVOCATION._serialized_start = 23782
-    _AGGREGATEFUNCTION_AGGREGATIONINVOCATION._serialized_end = 23914
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/ibis/algebra_pb2.pyi b/ibis_substrait/proto/substrait/ibis/algebra_pb2.pyi
deleted file mode 100644
index 118d239f..00000000
--- a/ibis_substrait/proto/substrait/ibis/algebra_pb2.pyi
+++ /dev/null
@@ -1,3330 +0,0 @@
-"""
-@generated by mypy-protobuf.  Do not edit manually!
-isort:skip_file
-SPDX-License-Identifier: Apache-2.0"""
-import builtins
-import collections.abc
-import google.protobuf.any_pb2
-import google.protobuf.descriptor
-import google.protobuf.internal.containers
-import google.protobuf.internal.enum_type_wrapper
-import google.protobuf.message
-from ... import substrait
-import sys
-import typing
-if sys.version_info >= (3, 10):
-    import typing as typing_extensions
-else:
-    import typing_extensions
-DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
-
-class _AggregationPhase:
-    ValueType = typing.NewType('ValueType', builtins.int)
-    V: typing_extensions.TypeAlias = ValueType
-
-class _AggregationPhaseEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_AggregationPhase.ValueType], builtins.type):
-    DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-    AGGREGATION_PHASE_UNSPECIFIED: _AggregationPhase.ValueType
-    'Implies `INTERMEDIATE_TO_RESULT`.'
-    AGGREGATION_PHASE_INITIAL_TO_INTERMEDIATE: _AggregationPhase.ValueType
-    'Specifies that the function should be run only up to the point of\n    generating an intermediate value, to be further aggregated later using\n    INTERMEDIATE_TO_INTERMEDIATE or INTERMEDIATE_TO_RESULT.\n    '
-    AGGREGATION_PHASE_INTERMEDIATE_TO_INTERMEDIATE: _AggregationPhase.ValueType
-    'Specifies that the inputs of the aggregate or window function are the\n    intermediate values of the function, and that the output should also be\n    an intermediate value, to be further aggregated later using\n    INTERMEDIATE_TO_INTERMEDIATE or INTERMEDIATE_TO_RESULT.\n    '
-    AGGREGATION_PHASE_INITIAL_TO_RESULT: _AggregationPhase.ValueType
-    'A complete invocation: the function should aggregate the given set of\n    inputs to yield a single return value. This style must be used for\n    aggregate or window functions that are not decomposable.\n    '
-    AGGREGATION_PHASE_INTERMEDIATE_TO_RESULT: _AggregationPhase.ValueType
-    'Specifies that the inputs of the aggregate or window function are the\n    intermediate values of the function, generated previously using\n    INITIAL_TO_INTERMEDIATE and possibly INTERMEDIATE_TO_INTERMEDIATE calls.\n    This call should combine the intermediate values to yield the final\n    return value.\n    '
-
-class AggregationPhase(_AggregationPhase, metaclass=_AggregationPhaseEnumTypeWrapper):
-    """Describes which part of an aggregation or window function to perform within
-    the context of distributed algorithms.
-    """
-AGGREGATION_PHASE_UNSPECIFIED: AggregationPhase.ValueType
-'Implies `INTERMEDIATE_TO_RESULT`.'
-AGGREGATION_PHASE_INITIAL_TO_INTERMEDIATE: AggregationPhase.ValueType
-'Specifies that the function should be run only up to the point of\ngenerating an intermediate value, to be further aggregated later using\nINTERMEDIATE_TO_INTERMEDIATE or INTERMEDIATE_TO_RESULT.\n'
-AGGREGATION_PHASE_INTERMEDIATE_TO_INTERMEDIATE: AggregationPhase.ValueType
-'Specifies that the inputs of the aggregate or window function are the\nintermediate values of the function, and that the output should also be\nan intermediate value, to be further aggregated later using\nINTERMEDIATE_TO_INTERMEDIATE or INTERMEDIATE_TO_RESULT.\n'
-AGGREGATION_PHASE_INITIAL_TO_RESULT: AggregationPhase.ValueType
-'A complete invocation: the function should aggregate the given set of\ninputs to yield a single return value. This style must be used for\naggregate or window functions that are not decomposable.\n'
-AGGREGATION_PHASE_INTERMEDIATE_TO_RESULT: AggregationPhase.ValueType
-'Specifies that the inputs of the aggregate or window function are the\nintermediate values of the function, generated previously using\nINITIAL_TO_INTERMEDIATE and possibly INTERMEDIATE_TO_INTERMEDIATE calls.\nThis call should combine the intermediate values to yield the final\nreturn value.\n'
-global___AggregationPhase = AggregationPhase
-
-class RelCommon(google.protobuf.message.Message):
-    """Common fields for all relational operators"""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class Direct(google.protobuf.message.Message):
-        """Direct indicates no change on presence and ordering of fields in the output"""
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        def __init__(self) -> None:
-            ...
-
-    class Emit(google.protobuf.message.Message):
-        """Remap which fields are output and in which order"""
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        OUTPUT_MAPPING_FIELD_NUMBER: builtins.int
-
-        @property
-        def output_mapping(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]:
-            ...
-
-        def __init__(self, *, output_mapping: collections.abc.Iterable[builtins.int] | None=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['output_mapping', b'output_mapping']) -> None:
-            ...
-
-    class Hint(google.protobuf.message.Message):
-        """Changes to the operation that can influence efficiency/performance but
-        should not impact correctness.
-        """
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class Stats(google.protobuf.message.Message):
-            """The statistics related to a hint (physical properties of records)"""
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            ROW_COUNT_FIELD_NUMBER: builtins.int
-            RECORD_SIZE_FIELD_NUMBER: builtins.int
-            ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-            row_count: builtins.float
-            record_size: builtins.float
-
-            @property
-            def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-                ...
-
-            def __init__(self, *, row_count: builtins.float=..., record_size: builtins.float=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'record_size', b'record_size', 'row_count', b'row_count']) -> None:
-                ...
-
-        class RuntimeConstraint(google.protobuf.message.Message):
-            """TODO: nodes, cpu threads/%, memory, iops, etc."""
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-
-            @property
-            def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-                ...
-
-            def __init__(self, *, advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension']) -> None:
-                ...
-        STATS_FIELD_NUMBER: builtins.int
-        CONSTRAINT_FIELD_NUMBER: builtins.int
-        ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-
-        @property
-        def stats(self) -> global___RelCommon.Hint.Stats:
-            ...
-
-        @property
-        def constraint(self) -> global___RelCommon.Hint.RuntimeConstraint:
-            ...
-
-        @property
-        def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-            ...
-
-        def __init__(self, *, stats: global___RelCommon.Hint.Stats | None=..., constraint: global___RelCommon.Hint.RuntimeConstraint | None=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'constraint', b'constraint', 'stats', b'stats']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'constraint', b'constraint', 'stats', b'stats']) -> None:
-            ...
-    DIRECT_FIELD_NUMBER: builtins.int
-    EMIT_FIELD_NUMBER: builtins.int
-    HINT_FIELD_NUMBER: builtins.int
-    ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-
-    @property
-    def direct(self) -> global___RelCommon.Direct:
-        """The underlying relation is output as is (no reordering or projection of columns)"""
-
-    @property
-    def emit(self) -> global___RelCommon.Emit:
-        """Allows to control for order and inclusion of fields"""
-
-    @property
-    def hint(self) -> global___RelCommon.Hint:
-        ...
-
-    @property
-    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-        ...
-
-    def __init__(self, *, direct: global___RelCommon.Direct | None=..., emit: global___RelCommon.Emit | None=..., hint: global___RelCommon.Hint | None=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'direct', b'direct', 'emit', b'emit', 'emit_kind', b'emit_kind', 'hint', b'hint']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'direct', b'direct', 'emit', b'emit', 'emit_kind', b'emit_kind', 'hint', b'hint']) -> None:
-        ...
-
-    def WhichOneof(self, oneof_group: typing_extensions.Literal['emit_kind', b'emit_kind']) -> typing_extensions.Literal['direct', 'emit'] | None:
-        ...
-global___RelCommon = RelCommon
-
-class ReadRel(google.protobuf.message.Message):
-    """The scan operator of base data (physical or virtual), including filtering and projection."""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class NamedTable(google.protobuf.message.Message):
-        """A base table. The list of string is used to represent namespacing (e.g., mydb.mytable).
-        This assumes shared catalog between systems exchanging a message.
-        """
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        NAMES_FIELD_NUMBER: builtins.int
-        ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-
-        @property
-        def names(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-            ...
-
-        @property
-        def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-            ...
-
-        def __init__(self, *, names: collections.abc.Iterable[builtins.str] | None=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'names', b'names']) -> None:
-            ...
-
-    class VirtualTable(google.protobuf.message.Message):
-        """A table composed of literals."""
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        VALUES_FIELD_NUMBER: builtins.int
-
-        @property
-        def values(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression.Literal.Struct]:
-            ...
-
-        def __init__(self, *, values: collections.abc.Iterable[global___Expression.Literal.Struct] | None=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['values', b'values']) -> None:
-            ...
-
-    class ExtensionTable(google.protobuf.message.Message):
-        """A stub type that can be used to extend/introduce new table types outside
-        the specification.
-        """
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        DETAIL_FIELD_NUMBER: builtins.int
-
-        @property
-        def detail(self) -> google.protobuf.any_pb2.Any:
-            ...
-
-        def __init__(self, *, detail: google.protobuf.any_pb2.Any | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['detail', b'detail']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['detail', b'detail']) -> None:
-            ...
-
-    class LocalFiles(google.protobuf.message.Message):
-        """Represents a list of files in input of a scan operation"""
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class FileOrFiles(google.protobuf.message.Message):
-            """Many files consist of indivisible chunks (e.g. parquet row groups
-            or CSV rows).  If a slice partially selects an indivisible chunk
-            then the consumer should employ some rule to decide which slice to
-            include the chunk in (e.g. include it in the slice that contains
-            the midpoint of the chunk)
-            """
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-            class ParquetReadOptions(google.protobuf.message.Message):
-                DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-                def __init__(self) -> None:
-                    ...
-
-            class ArrowReadOptions(google.protobuf.message.Message):
-                DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-                def __init__(self) -> None:
-                    ...
-
-            class OrcReadOptions(google.protobuf.message.Message):
-                DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-                def __init__(self) -> None:
-                    ...
-
-            class DwrfReadOptions(google.protobuf.message.Message):
-                DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-                def __init__(self) -> None:
-                    ...
-            URI_PATH_FIELD_NUMBER: builtins.int
-            URI_PATH_GLOB_FIELD_NUMBER: builtins.int
-            URI_FILE_FIELD_NUMBER: builtins.int
-            URI_FOLDER_FIELD_NUMBER: builtins.int
-            PARTITION_INDEX_FIELD_NUMBER: builtins.int
-            START_FIELD_NUMBER: builtins.int
-            LENGTH_FIELD_NUMBER: builtins.int
-            PARQUET_FIELD_NUMBER: builtins.int
-            ARROW_FIELD_NUMBER: builtins.int
-            ORC_FIELD_NUMBER: builtins.int
-            EXTENSION_FIELD_NUMBER: builtins.int
-            DWRF_FIELD_NUMBER: builtins.int
-            uri_path: builtins.str
-            'A URI that can refer to either a single folder or a single file'
-            uri_path_glob: builtins.str
-            'A URI where the path portion is a glob expression that can\n            identify zero or more paths.\n            Consumers should support the POSIX syntax.  The recursive\n            globstar (**) may not be supported.\n            '
-            uri_file: builtins.str
-            'A URI that refers to a single file'
-            uri_folder: builtins.str
-            'A URI that refers to a single folder'
-            partition_index: builtins.int
-            'The index of the partition this item belongs to'
-            start: builtins.int
-            'The start position in byte to read from this item'
-            length: builtins.int
-            'The length in byte to read from this item'
-
-            @property
-            def parquet(self) -> global___ReadRel.LocalFiles.FileOrFiles.ParquetReadOptions:
-                ...
-
-            @property
-            def arrow(self) -> global___ReadRel.LocalFiles.FileOrFiles.ArrowReadOptions:
-                ...
-
-            @property
-            def orc(self) -> global___ReadRel.LocalFiles.FileOrFiles.OrcReadOptions:
-                ...
-
-            @property
-            def extension(self) -> google.protobuf.any_pb2.Any:
-                ...
-
-            @property
-            def dwrf(self) -> global___ReadRel.LocalFiles.FileOrFiles.DwrfReadOptions:
-                ...
-
-            def __init__(self, *, uri_path: builtins.str=..., uri_path_glob: builtins.str=..., uri_file: builtins.str=..., uri_folder: builtins.str=..., partition_index: builtins.int=..., start: builtins.int=..., length: builtins.int=..., parquet: global___ReadRel.LocalFiles.FileOrFiles.ParquetReadOptions | None=..., arrow: global___ReadRel.LocalFiles.FileOrFiles.ArrowReadOptions | None=..., orc: global___ReadRel.LocalFiles.FileOrFiles.OrcReadOptions | None=..., extension: google.protobuf.any_pb2.Any | None=..., dwrf: global___ReadRel.LocalFiles.FileOrFiles.DwrfReadOptions | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['arrow', b'arrow', 'dwrf', b'dwrf', 'extension', b'extension', 'file_format', b'file_format', 'orc', b'orc', 'parquet', b'parquet', 'path_type', b'path_type', 'uri_file', b'uri_file', 'uri_folder', b'uri_folder', 'uri_path', b'uri_path', 'uri_path_glob', b'uri_path_glob']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['arrow', b'arrow', 'dwrf', b'dwrf', 'extension', b'extension', 'file_format', b'file_format', 'length', b'length', 'orc', b'orc', 'parquet', b'parquet', 'partition_index', b'partition_index', 'path_type', b'path_type', 'start', b'start', 'uri_file', b'uri_file', 'uri_folder', b'uri_folder', 'uri_path', b'uri_path', 'uri_path_glob', b'uri_path_glob']) -> None:
-                ...
-
-            @typing.overload
-            def WhichOneof(self, oneof_group: typing_extensions.Literal['file_format', b'file_format']) -> typing_extensions.Literal['parquet', 'arrow', 'orc', 'extension', 'dwrf'] | None:
-                ...
-
-            @typing.overload
-            def WhichOneof(self, oneof_group: typing_extensions.Literal['path_type', b'path_type']) -> typing_extensions.Literal['uri_path', 'uri_path_glob', 'uri_file', 'uri_folder'] | None:
-                ...
-        ITEMS_FIELD_NUMBER: builtins.int
-        ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-
-        @property
-        def items(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ReadRel.LocalFiles.FileOrFiles]:
-            ...
-
-        @property
-        def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-            ...
-
-        def __init__(self, *, items: collections.abc.Iterable[global___ReadRel.LocalFiles.FileOrFiles] | None=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'items', b'items']) -> None:
-            ...
-    COMMON_FIELD_NUMBER: builtins.int
-    BASE_SCHEMA_FIELD_NUMBER: builtins.int
-    FILTER_FIELD_NUMBER: builtins.int
-    BEST_EFFORT_FILTER_FIELD_NUMBER: builtins.int
-    PROJECTION_FIELD_NUMBER: builtins.int
-    ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-    VIRTUAL_TABLE_FIELD_NUMBER: builtins.int
-    LOCAL_FILES_FIELD_NUMBER: builtins.int
-    NAMED_TABLE_FIELD_NUMBER: builtins.int
-    EXTENSION_TABLE_FIELD_NUMBER: builtins.int
-
-    @property
-    def common(self) -> global___RelCommon:
-        ...
-
-    @property
-    def base_schema(self) -> substrait.ibis.type_pb2.NamedStruct:
-        ...
-
-    @property
-    def filter(self) -> global___Expression:
-        ...
-
-    @property
-    def best_effort_filter(self) -> global___Expression:
-        ...
-
-    @property
-    def projection(self) -> global___Expression.MaskExpression:
-        ...
-
-    @property
-    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-        ...
-
-    @property
-    def virtual_table(self) -> global___ReadRel.VirtualTable:
-        ...
-
-    @property
-    def local_files(self) -> global___ReadRel.LocalFiles:
-        ...
-
-    @property
-    def named_table(self) -> global___ReadRel.NamedTable:
-        ...
-
-    @property
-    def extension_table(self) -> global___ReadRel.ExtensionTable:
-        ...
-
-    def __init__(self, *, common: global___RelCommon | None=..., base_schema: substrait.ibis.type_pb2.NamedStruct | None=..., filter: global___Expression | None=..., best_effort_filter: global___Expression | None=..., projection: global___Expression.MaskExpression | None=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=..., virtual_table: global___ReadRel.VirtualTable | None=..., local_files: global___ReadRel.LocalFiles | None=..., named_table: global___ReadRel.NamedTable | None=..., extension_table: global___ReadRel.ExtensionTable | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'base_schema', b'base_schema', 'best_effort_filter', b'best_effort_filter', 'common', b'common', 'extension_table', b'extension_table', 'filter', b'filter', 'local_files', b'local_files', 'named_table', b'named_table', 'projection', b'projection', 'read_type', b'read_type', 'virtual_table', b'virtual_table']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'base_schema', b'base_schema', 'best_effort_filter', b'best_effort_filter', 'common', b'common', 'extension_table', b'extension_table', 'filter', b'filter', 'local_files', b'local_files', 'named_table', b'named_table', 'projection', b'projection', 'read_type', b'read_type', 'virtual_table', b'virtual_table']) -> None:
-        ...
-
-    def WhichOneof(self, oneof_group: typing_extensions.Literal['read_type', b'read_type']) -> typing_extensions.Literal['virtual_table', 'local_files', 'named_table', 'extension_table'] | None:
-        ...
-global___ReadRel = ReadRel
-
-class ProjectRel(google.protobuf.message.Message):
-    """This operator allows to represent calculated expressions of fields (e.g., a+b). Direct/Emit are used to represent classical relational projections"""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    COMMON_FIELD_NUMBER: builtins.int
-    INPUT_FIELD_NUMBER: builtins.int
-    EXPRESSIONS_FIELD_NUMBER: builtins.int
-    ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-
-    @property
-    def common(self) -> global___RelCommon:
-        ...
-
-    @property
-    def input(self) -> global___Rel:
-        ...
-
-    @property
-    def expressions(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression]:
-        ...
-
-    @property
-    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-        ...
-
-    def __init__(self, *, common: global___RelCommon | None=..., input: global___Rel | None=..., expressions: collections.abc.Iterable[global___Expression] | None=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'input', b'input']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'expressions', b'expressions', 'input', b'input']) -> None:
-        ...
-global___ProjectRel = ProjectRel
-
-class JoinRel(google.protobuf.message.Message):
-    """The binary JOIN relational operator left-join-right, including various join types, a join condition and post_join_filter expression"""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class _JoinType:
-        ValueType = typing.NewType('ValueType', builtins.int)
-        V: typing_extensions.TypeAlias = ValueType
-
-    class _JoinTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[JoinRel._JoinType.ValueType], builtins.type):
-        DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-        JOIN_TYPE_UNSPECIFIED: JoinRel._JoinType.ValueType
-        JOIN_TYPE_INNER: JoinRel._JoinType.ValueType
-        JOIN_TYPE_OUTER: JoinRel._JoinType.ValueType
-        JOIN_TYPE_LEFT: JoinRel._JoinType.ValueType
-        JOIN_TYPE_RIGHT: JoinRel._JoinType.ValueType
-        JOIN_TYPE_SEMI: JoinRel._JoinType.ValueType
-        JOIN_TYPE_ANTI: JoinRel._JoinType.ValueType
-        JOIN_TYPE_SINGLE: JoinRel._JoinType.ValueType
-        'This join is useful for nested sub-queries where we need exactly one tuple in output (or throw exception)\n        See Section 3.2 of https://15721.courses.cs.cmu.edu/spring2018/papers/16-optimizer2/hyperjoins-btw2017.pdf\n        '
-
-    class JoinType(_JoinType, metaclass=_JoinTypeEnumTypeWrapper):
-        ...
-    JOIN_TYPE_UNSPECIFIED: JoinRel.JoinType.ValueType
-    JOIN_TYPE_INNER: JoinRel.JoinType.ValueType
-    JOIN_TYPE_OUTER: JoinRel.JoinType.ValueType
-    JOIN_TYPE_LEFT: JoinRel.JoinType.ValueType
-    JOIN_TYPE_RIGHT: JoinRel.JoinType.ValueType
-    JOIN_TYPE_SEMI: JoinRel.JoinType.ValueType
-    JOIN_TYPE_ANTI: JoinRel.JoinType.ValueType
-    JOIN_TYPE_SINGLE: JoinRel.JoinType.ValueType
-    'This join is useful for nested sub-queries where we need exactly one tuple in output (or throw exception)\n    See Section 3.2 of https://15721.courses.cs.cmu.edu/spring2018/papers/16-optimizer2/hyperjoins-btw2017.pdf\n    '
-    COMMON_FIELD_NUMBER: builtins.int
-    LEFT_FIELD_NUMBER: builtins.int
-    RIGHT_FIELD_NUMBER: builtins.int
-    EXPRESSION_FIELD_NUMBER: builtins.int
-    POST_JOIN_FILTER_FIELD_NUMBER: builtins.int
-    TYPE_FIELD_NUMBER: builtins.int
-    ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-
-    @property
-    def common(self) -> global___RelCommon:
-        ...
-
-    @property
-    def left(self) -> global___Rel:
-        ...
-
-    @property
-    def right(self) -> global___Rel:
-        ...
-
-    @property
-    def expression(self) -> global___Expression:
-        ...
-
-    @property
-    def post_join_filter(self) -> global___Expression:
-        ...
-    type: global___JoinRel.JoinType.ValueType
-
-    @property
-    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-        ...
-
-    def __init__(self, *, common: global___RelCommon | None=..., left: global___Rel | None=..., right: global___Rel | None=..., expression: global___Expression | None=..., post_join_filter: global___Expression | None=..., type: global___JoinRel.JoinType.ValueType=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'expression', b'expression', 'left', b'left', 'post_join_filter', b'post_join_filter', 'right', b'right']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'expression', b'expression', 'left', b'left', 'post_join_filter', b'post_join_filter', 'right', b'right', 'type', b'type']) -> None:
-        ...
-global___JoinRel = JoinRel
-
-class CrossRel(google.protobuf.message.Message):
-    """Cartesian product relational operator of two tables (left and right)"""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    COMMON_FIELD_NUMBER: builtins.int
-    LEFT_FIELD_NUMBER: builtins.int
-    RIGHT_FIELD_NUMBER: builtins.int
-    ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-
-    @property
-    def common(self) -> global___RelCommon:
-        ...
-
-    @property
-    def left(self) -> global___Rel:
-        ...
-
-    @property
-    def right(self) -> global___Rel:
-        ...
-
-    @property
-    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-        ...
-
-    def __init__(self, *, common: global___RelCommon | None=..., left: global___Rel | None=..., right: global___Rel | None=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'left', b'left', 'right', b'right']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'left', b'left', 'right', b'right']) -> None:
-        ...
-global___CrossRel = CrossRel
-
-class FetchRel(google.protobuf.message.Message):
-    """The relational operator representing LIMIT/OFFSET or TOP type semantics."""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    COMMON_FIELD_NUMBER: builtins.int
-    INPUT_FIELD_NUMBER: builtins.int
-    OFFSET_FIELD_NUMBER: builtins.int
-    COUNT_FIELD_NUMBER: builtins.int
-    ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-
-    @property
-    def common(self) -> global___RelCommon:
-        ...
-
-    @property
-    def input(self) -> global___Rel:
-        ...
-    offset: builtins.int
-    'the offset expressed in number of records'
-    count: builtins.int
-    'the amount of records to return'
-
-    @property
-    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-        ...
-
-    def __init__(self, *, common: global___RelCommon | None=..., input: global___Rel | None=..., offset: builtins.int=..., count: builtins.int=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'input', b'input']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'count', b'count', 'input', b'input', 'offset', b'offset']) -> None:
-        ...
-global___FetchRel = FetchRel
-
-class AggregateRel(google.protobuf.message.Message):
-    """The relational operator representing a GROUP BY Aggregate"""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class Grouping(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        GROUPING_EXPRESSIONS_FIELD_NUMBER: builtins.int
-
-        @property
-        def grouping_expressions(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression]:
-            ...
-
-        def __init__(self, *, grouping_expressions: collections.abc.Iterable[global___Expression] | None=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['grouping_expressions', b'grouping_expressions']) -> None:
-            ...
-
-    class Measure(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        MEASURE_FIELD_NUMBER: builtins.int
-        FILTER_FIELD_NUMBER: builtins.int
-
-        @property
-        def measure(self) -> global___AggregateFunction:
-            ...
-
-        @property
-        def filter(self) -> global___Expression:
-            """An optional boolean expression that acts to filter which records are
-            included in the measure. True means include this record for calculation
-            within the measure.
-            Helps to support SUM(<c>) FILTER(WHERE...) syntax without masking opportunities for optimization
-            """
-
-        def __init__(self, *, measure: global___AggregateFunction | None=..., filter: global___Expression | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['filter', b'filter', 'measure', b'measure']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['filter', b'filter', 'measure', b'measure']) -> None:
-            ...
-    COMMON_FIELD_NUMBER: builtins.int
-    INPUT_FIELD_NUMBER: builtins.int
-    GROUPINGS_FIELD_NUMBER: builtins.int
-    MEASURES_FIELD_NUMBER: builtins.int
-    ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-
-    @property
-    def common(self) -> global___RelCommon:
-        ...
-
-    @property
-    def input(self) -> global___Rel:
-        """Input of the aggregation"""
-
-    @property
-    def groupings(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___AggregateRel.Grouping]:
-        """A list of expression grouping that the aggregation measured should be calculated for."""
-
-    @property
-    def measures(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___AggregateRel.Measure]:
-        """A list of one or more aggregate expressions along with an optional filter."""
-
-    @property
-    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-        ...
-
-    def __init__(self, *, common: global___RelCommon | None=..., input: global___Rel | None=..., groupings: collections.abc.Iterable[global___AggregateRel.Grouping] | None=..., measures: collections.abc.Iterable[global___AggregateRel.Measure] | None=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'input', b'input']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'groupings', b'groupings', 'input', b'input', 'measures', b'measures']) -> None:
-        ...
-global___AggregateRel = AggregateRel
-
-class SortRel(google.protobuf.message.Message):
-    """The ORDERY BY (or sorting) relational operator. Beside describing a base relation, it includes a list of fields to sort on"""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    COMMON_FIELD_NUMBER: builtins.int
-    INPUT_FIELD_NUMBER: builtins.int
-    SORTS_FIELD_NUMBER: builtins.int
-    ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-
-    @property
-    def common(self) -> global___RelCommon:
-        ...
-
-    @property
-    def input(self) -> global___Rel:
-        ...
-
-    @property
-    def sorts(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___SortField]:
-        ...
-
-    @property
-    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-        ...
-
-    def __init__(self, *, common: global___RelCommon | None=..., input: global___Rel | None=..., sorts: collections.abc.Iterable[global___SortField] | None=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'input', b'input']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'input', b'input', 'sorts', b'sorts']) -> None:
-        ...
-global___SortRel = SortRel
-
-class FilterRel(google.protobuf.message.Message):
-    """The relational operator capturing simple FILTERs (as in the WHERE clause of SQL)"""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    COMMON_FIELD_NUMBER: builtins.int
-    INPUT_FIELD_NUMBER: builtins.int
-    CONDITION_FIELD_NUMBER: builtins.int
-    ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-
-    @property
-    def common(self) -> global___RelCommon:
-        ...
-
-    @property
-    def input(self) -> global___Rel:
-        ...
-
-    @property
-    def condition(self) -> global___Expression:
-        ...
-
-    @property
-    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-        ...
-
-    def __init__(self, *, common: global___RelCommon | None=..., input: global___Rel | None=..., condition: global___Expression | None=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'condition', b'condition', 'input', b'input']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'condition', b'condition', 'input', b'input']) -> None:
-        ...
-global___FilterRel = FilterRel
-
-class SetRel(google.protobuf.message.Message):
-    """The relational set operators (intersection/union/etc..)"""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class _SetOp:
-        ValueType = typing.NewType('ValueType', builtins.int)
-        V: typing_extensions.TypeAlias = ValueType
-
-    class _SetOpEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[SetRel._SetOp.ValueType], builtins.type):
-        DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-        SET_OP_UNSPECIFIED: SetRel._SetOp.ValueType
-        SET_OP_MINUS_PRIMARY: SetRel._SetOp.ValueType
-        SET_OP_MINUS_MULTISET: SetRel._SetOp.ValueType
-        SET_OP_INTERSECTION_PRIMARY: SetRel._SetOp.ValueType
-        SET_OP_INTERSECTION_MULTISET: SetRel._SetOp.ValueType
-        SET_OP_UNION_DISTINCT: SetRel._SetOp.ValueType
-        SET_OP_UNION_ALL: SetRel._SetOp.ValueType
-
-    class SetOp(_SetOp, metaclass=_SetOpEnumTypeWrapper):
-        ...
-    SET_OP_UNSPECIFIED: SetRel.SetOp.ValueType
-    SET_OP_MINUS_PRIMARY: SetRel.SetOp.ValueType
-    SET_OP_MINUS_MULTISET: SetRel.SetOp.ValueType
-    SET_OP_INTERSECTION_PRIMARY: SetRel.SetOp.ValueType
-    SET_OP_INTERSECTION_MULTISET: SetRel.SetOp.ValueType
-    SET_OP_UNION_DISTINCT: SetRel.SetOp.ValueType
-    SET_OP_UNION_ALL: SetRel.SetOp.ValueType
-    COMMON_FIELD_NUMBER: builtins.int
-    INPUTS_FIELD_NUMBER: builtins.int
-    OP_FIELD_NUMBER: builtins.int
-    ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-
-    @property
-    def common(self) -> global___RelCommon:
-        ...
-
-    @property
-    def inputs(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Rel]:
-        """The first input is the primary input, the remaining are secondary
-        inputs.  There must be at least two inputs.
-        """
-    op: global___SetRel.SetOp.ValueType
-
-    @property
-    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-        ...
-
-    def __init__(self, *, common: global___RelCommon | None=..., inputs: collections.abc.Iterable[global___Rel] | None=..., op: global___SetRel.SetOp.ValueType=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'inputs', b'inputs', 'op', b'op']) -> None:
-        ...
-global___SetRel = SetRel
-
-class ExtensionSingleRel(google.protobuf.message.Message):
-    """Stub to support extension with a single input"""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    COMMON_FIELD_NUMBER: builtins.int
-    INPUT_FIELD_NUMBER: builtins.int
-    DETAIL_FIELD_NUMBER: builtins.int
-
-    @property
-    def common(self) -> global___RelCommon:
-        ...
-
-    @property
-    def input(self) -> global___Rel:
-        ...
-
-    @property
-    def detail(self) -> google.protobuf.any_pb2.Any:
-        ...
-
-    def __init__(self, *, common: global___RelCommon | None=..., input: global___Rel | None=..., detail: google.protobuf.any_pb2.Any | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['common', b'common', 'detail', b'detail', 'input', b'input']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['common', b'common', 'detail', b'detail', 'input', b'input']) -> None:
-        ...
-global___ExtensionSingleRel = ExtensionSingleRel
-
-class ExtensionLeafRel(google.protobuf.message.Message):
-    """Stub to support extension with a zero inputs"""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    COMMON_FIELD_NUMBER: builtins.int
-    DETAIL_FIELD_NUMBER: builtins.int
-
-    @property
-    def common(self) -> global___RelCommon:
-        ...
-
-    @property
-    def detail(self) -> google.protobuf.any_pb2.Any:
-        ...
-
-    def __init__(self, *, common: global___RelCommon | None=..., detail: google.protobuf.any_pb2.Any | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['common', b'common', 'detail', b'detail']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['common', b'common', 'detail', b'detail']) -> None:
-        ...
-global___ExtensionLeafRel = ExtensionLeafRel
-
-class ExtensionMultiRel(google.protobuf.message.Message):
-    """Stub to support extension with multiple inputs"""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    COMMON_FIELD_NUMBER: builtins.int
-    INPUTS_FIELD_NUMBER: builtins.int
-    DETAIL_FIELD_NUMBER: builtins.int
-
-    @property
-    def common(self) -> global___RelCommon:
-        ...
-
-    @property
-    def inputs(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Rel]:
-        ...
-
-    @property
-    def detail(self) -> google.protobuf.any_pb2.Any:
-        ...
-
-    def __init__(self, *, common: global___RelCommon | None=..., inputs: collections.abc.Iterable[global___Rel] | None=..., detail: google.protobuf.any_pb2.Any | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['common', b'common', 'detail', b'detail']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['common', b'common', 'detail', b'detail', 'inputs', b'inputs']) -> None:
-        ...
-global___ExtensionMultiRel = ExtensionMultiRel
-
-class ExchangeRel(google.protobuf.message.Message):
-    """A redistribution operation"""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class ScatterFields(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        FIELDS_FIELD_NUMBER: builtins.int
-
-        @property
-        def fields(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression.FieldReference]:
-            ...
-
-        def __init__(self, *, fields: collections.abc.Iterable[global___Expression.FieldReference] | None=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['fields', b'fields']) -> None:
-            ...
-
-    class SingleBucketExpression(google.protobuf.message.Message):
-        """Returns a single bucket number per record."""
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        EXPRESSION_FIELD_NUMBER: builtins.int
-
-        @property
-        def expression(self) -> global___Expression:
-            ...
-
-        def __init__(self, *, expression: global___Expression | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['expression', b'expression']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['expression', b'expression']) -> None:
-            ...
-
-    class MultiBucketExpression(google.protobuf.message.Message):
-        """Returns zero or more bucket numbers per record"""
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        EXPRESSION_FIELD_NUMBER: builtins.int
-        CONSTRAINED_TO_COUNT_FIELD_NUMBER: builtins.int
-
-        @property
-        def expression(self) -> global___Expression:
-            ...
-        constrained_to_count: builtins.bool
-
-        def __init__(self, *, expression: global___Expression | None=..., constrained_to_count: builtins.bool=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['expression', b'expression']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['constrained_to_count', b'constrained_to_count', 'expression', b'expression']) -> None:
-            ...
-
-    class Broadcast(google.protobuf.message.Message):
-        """Send all data to every target."""
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        def __init__(self) -> None:
-            ...
-
-    class RoundRobin(google.protobuf.message.Message):
-        """Route approximately"""
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        EXACT_FIELD_NUMBER: builtins.int
-        exact: builtins.bool
-        'whether the round robin behavior is required to exact (per record) or\n        approximate. Defaults to approximate.\n        '
-
-        def __init__(self, *, exact: builtins.bool=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['exact', b'exact']) -> None:
-            ...
-
-    class ExchangeTarget(google.protobuf.message.Message):
-        """The message to describe partition targets of an exchange"""
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        PARTITION_ID_FIELD_NUMBER: builtins.int
-        URI_FIELD_NUMBER: builtins.int
-        EXTENDED_FIELD_NUMBER: builtins.int
-
-        @property
-        def partition_id(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]:
-            """Describes the partition id(s) to send. If this is empty, all data is sent
-            to this target.
-            """
-        uri: builtins.str
-
-        @property
-        def extended(self) -> google.protobuf.any_pb2.Any:
-            ...
-
-        def __init__(self, *, partition_id: collections.abc.Iterable[builtins.int] | None=..., uri: builtins.str=..., extended: google.protobuf.any_pb2.Any | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['extended', b'extended', 'target_type', b'target_type', 'uri', b'uri']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['extended', b'extended', 'partition_id', b'partition_id', 'target_type', b'target_type', 'uri', b'uri']) -> None:
-            ...
-
-        def WhichOneof(self, oneof_group: typing_extensions.Literal['target_type', b'target_type']) -> typing_extensions.Literal['uri', 'extended'] | None:
-            ...
-    COMMON_FIELD_NUMBER: builtins.int
-    INPUT_FIELD_NUMBER: builtins.int
-    PARTITION_COUNT_FIELD_NUMBER: builtins.int
-    TARGETS_FIELD_NUMBER: builtins.int
-    SCATTER_BY_FIELDS_FIELD_NUMBER: builtins.int
-    SINGLE_TARGET_FIELD_NUMBER: builtins.int
-    MULTI_TARGET_FIELD_NUMBER: builtins.int
-    ROUND_ROBIN_FIELD_NUMBER: builtins.int
-    BROADCAST_FIELD_NUMBER: builtins.int
-    ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-
-    @property
-    def common(self) -> global___RelCommon:
-        ...
-
-    @property
-    def input(self) -> global___Rel:
-        ...
-    partition_count: builtins.int
-
-    @property
-    def targets(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ExchangeRel.ExchangeTarget]:
-        ...
-
-    @property
-    def scatter_by_fields(self) -> global___ExchangeRel.ScatterFields:
-        ...
-
-    @property
-    def single_target(self) -> global___ExchangeRel.SingleBucketExpression:
-        ...
-
-    @property
-    def multi_target(self) -> global___ExchangeRel.MultiBucketExpression:
-        ...
-
-    @property
-    def round_robin(self) -> global___ExchangeRel.RoundRobin:
-        ...
-
-    @property
-    def broadcast(self) -> global___ExchangeRel.Broadcast:
-        ...
-
-    @property
-    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-        ...
-
-    def __init__(self, *, common: global___RelCommon | None=..., input: global___Rel | None=..., partition_count: builtins.int=..., targets: collections.abc.Iterable[global___ExchangeRel.ExchangeTarget] | None=..., scatter_by_fields: global___ExchangeRel.ScatterFields | None=..., single_target: global___ExchangeRel.SingleBucketExpression | None=..., multi_target: global___ExchangeRel.MultiBucketExpression | None=..., round_robin: global___ExchangeRel.RoundRobin | None=..., broadcast: global___ExchangeRel.Broadcast | None=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'broadcast', b'broadcast', 'common', b'common', 'exchange_kind', b'exchange_kind', 'input', b'input', 'multi_target', b'multi_target', 'round_robin', b'round_robin', 'scatter_by_fields', b'scatter_by_fields', 'single_target', b'single_target']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'broadcast', b'broadcast', 'common', b'common', 'exchange_kind', b'exchange_kind', 'input', b'input', 'multi_target', b'multi_target', 'partition_count', b'partition_count', 'round_robin', b'round_robin', 'scatter_by_fields', b'scatter_by_fields', 'single_target', b'single_target', 'targets', b'targets']) -> None:
-        ...
-
-    def WhichOneof(self, oneof_group: typing_extensions.Literal['exchange_kind', b'exchange_kind']) -> typing_extensions.Literal['scatter_by_fields', 'single_target', 'multi_target', 'round_robin', 'broadcast'] | None:
-        ...
-global___ExchangeRel = ExchangeRel
-
-class RelRoot(google.protobuf.message.Message):
-    """A relation with output field names.
-
-    This is for use at the root of a `Rel` tree.
-    """
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    INPUT_FIELD_NUMBER: builtins.int
-    NAMES_FIELD_NUMBER: builtins.int
-
-    @property
-    def input(self) -> global___Rel:
-        """A relation"""
-
-    @property
-    def names(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-        """Field names in depth-first order"""
-
-    def __init__(self, *, input: global___Rel | None=..., names: collections.abc.Iterable[builtins.str] | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['input', b'input']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['input', b'input', 'names', b'names']) -> None:
-        ...
-global___RelRoot = RelRoot
-
-class Rel(google.protobuf.message.Message):
-    """A relation (used internally in a plan)"""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    READ_FIELD_NUMBER: builtins.int
-    FILTER_FIELD_NUMBER: builtins.int
-    FETCH_FIELD_NUMBER: builtins.int
-    AGGREGATE_FIELD_NUMBER: builtins.int
-    SORT_FIELD_NUMBER: builtins.int
-    JOIN_FIELD_NUMBER: builtins.int
-    PROJECT_FIELD_NUMBER: builtins.int
-    SET_FIELD_NUMBER: builtins.int
-    EXTENSION_SINGLE_FIELD_NUMBER: builtins.int
-    EXTENSION_MULTI_FIELD_NUMBER: builtins.int
-    EXTENSION_LEAF_FIELD_NUMBER: builtins.int
-    CROSS_FIELD_NUMBER: builtins.int
-    HASH_JOIN_FIELD_NUMBER: builtins.int
-    MERGE_JOIN_FIELD_NUMBER: builtins.int
-
-    @property
-    def read(self) -> global___ReadRel:
-        ...
-
-    @property
-    def filter(self) -> global___FilterRel:
-        ...
-
-    @property
-    def fetch(self) -> global___FetchRel:
-        ...
-
-    @property
-    def aggregate(self) -> global___AggregateRel:
-        ...
-
-    @property
-    def sort(self) -> global___SortRel:
-        ...
-
-    @property
-    def join(self) -> global___JoinRel:
-        ...
-
-    @property
-    def project(self) -> global___ProjectRel:
-        ...
-
-    @property
-    def set(self) -> global___SetRel:
-        ...
-
-    @property
-    def extension_single(self) -> global___ExtensionSingleRel:
-        ...
-
-    @property
-    def extension_multi(self) -> global___ExtensionMultiRel:
-        ...
-
-    @property
-    def extension_leaf(self) -> global___ExtensionLeafRel:
-        ...
-
-    @property
-    def cross(self) -> global___CrossRel:
-        ...
-
-    @property
-    def hash_join(self) -> global___HashJoinRel:
-        """Physical relations"""
-
-    @property
-    def merge_join(self) -> global___MergeJoinRel:
-        ...
-
-    def __init__(self, *, read: global___ReadRel | None=..., filter: global___FilterRel | None=..., fetch: global___FetchRel | None=..., aggregate: global___AggregateRel | None=..., sort: global___SortRel | None=..., join: global___JoinRel | None=..., project: global___ProjectRel | None=..., set: global___SetRel | None=..., extension_single: global___ExtensionSingleRel | None=..., extension_multi: global___ExtensionMultiRel | None=..., extension_leaf: global___ExtensionLeafRel | None=..., cross: global___CrossRel | None=..., hash_join: global___HashJoinRel | None=..., merge_join: global___MergeJoinRel | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['aggregate', b'aggregate', 'cross', b'cross', 'extension_leaf', b'extension_leaf', 'extension_multi', b'extension_multi', 'extension_single', b'extension_single', 'fetch', b'fetch', 'filter', b'filter', 'hash_join', b'hash_join', 'join', b'join', 'merge_join', b'merge_join', 'project', b'project', 'read', b'read', 'rel_type', b'rel_type', 'set', b'set', 'sort', b'sort']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['aggregate', b'aggregate', 'cross', b'cross', 'extension_leaf', b'extension_leaf', 'extension_multi', b'extension_multi', 'extension_single', b'extension_single', 'fetch', b'fetch', 'filter', b'filter', 'hash_join', b'hash_join', 'join', b'join', 'merge_join', b'merge_join', 'project', b'project', 'read', b'read', 'rel_type', b'rel_type', 'set', b'set', 'sort', b'sort']) -> None:
-        ...
-
-    def WhichOneof(self, oneof_group: typing_extensions.Literal['rel_type', b'rel_type']) -> typing_extensions.Literal['read', 'filter', 'fetch', 'aggregate', 'sort', 'join', 'project', 'set', 'extension_single', 'extension_multi', 'extension_leaf', 'cross', 'hash_join', 'merge_join'] | None:
-        ...
-global___Rel = Rel
-
-class NamedObjectWrite(google.protobuf.message.Message):
-    """A base object for writing (e.g., a table or a view)."""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    NAMES_FIELD_NUMBER: builtins.int
-    ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-
-    @property
-    def names(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-        """The list of string is used to represent namespacing (e.g., mydb.mytable).
-        This assumes shared catalog between systems exchanging a message.
-        """
-
-    @property
-    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-        ...
-
-    def __init__(self, *, names: collections.abc.Iterable[builtins.str] | None=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'names', b'names']) -> None:
-        ...
-global___NamedObjectWrite = NamedObjectWrite
-
-class ExtensionObject(google.protobuf.message.Message):
-    """A stub type that can be used to extend/introduce new table types outside
-    the specification.
-    """
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    DETAIL_FIELD_NUMBER: builtins.int
-
-    @property
-    def detail(self) -> google.protobuf.any_pb2.Any:
-        ...
-
-    def __init__(self, *, detail: google.protobuf.any_pb2.Any | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['detail', b'detail']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['detail', b'detail']) -> None:
-        ...
-global___ExtensionObject = ExtensionObject
-
-class DdlRel(google.protobuf.message.Message):
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class _DdlObject:
-        ValueType = typing.NewType('ValueType', builtins.int)
-        V: typing_extensions.TypeAlias = ValueType
-
-    class _DdlObjectEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[DdlRel._DdlObject.ValueType], builtins.type):
-        DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-        DDL_OBJECT_UNSPECIFIED: DdlRel._DdlObject.ValueType
-        DDL_OBJECT_TABLE: DdlRel._DdlObject.ValueType
-        'A Table object in the system'
-        DDL_OBJECT_VIEW: DdlRel._DdlObject.ValueType
-        'A View object in the system'
-
-    class DdlObject(_DdlObject, metaclass=_DdlObjectEnumTypeWrapper):
-        ...
-    DDL_OBJECT_UNSPECIFIED: DdlRel.DdlObject.ValueType
-    DDL_OBJECT_TABLE: DdlRel.DdlObject.ValueType
-    'A Table object in the system'
-    DDL_OBJECT_VIEW: DdlRel.DdlObject.ValueType
-    'A View object in the system'
-
-    class _DdlOp:
-        ValueType = typing.NewType('ValueType', builtins.int)
-        V: typing_extensions.TypeAlias = ValueType
-
-    class _DdlOpEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[DdlRel._DdlOp.ValueType], builtins.type):
-        DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-        DDL_OP_UNSPECIFIED: DdlRel._DdlOp.ValueType
-        DDL_OP_CREATE: DdlRel._DdlOp.ValueType
-        'A create operation (for any object)'
-        DDL_OP_CREATE_OR_REPLACE: DdlRel._DdlOp.ValueType
-        'A create operation if the object does not exist, or replaces it (equivalent to a DROP + CREATE) if the object already exists'
-        DDL_OP_ALTER: DdlRel._DdlOp.ValueType
-        'An operation that modifies the schema (e.g., column names, types, default values) for the target object'
-        DDL_OP_DROP: DdlRel._DdlOp.ValueType
-        'An operation that removes an object from the system'
-        DDL_OP_DROP_IF_EXIST: DdlRel._DdlOp.ValueType
-        'An operation that removes an object from the system (without throwing an exception if the object did not exist)'
-
-    class DdlOp(_DdlOp, metaclass=_DdlOpEnumTypeWrapper):
-        ...
-    DDL_OP_UNSPECIFIED: DdlRel.DdlOp.ValueType
-    DDL_OP_CREATE: DdlRel.DdlOp.ValueType
-    'A create operation (for any object)'
-    DDL_OP_CREATE_OR_REPLACE: DdlRel.DdlOp.ValueType
-    'A create operation if the object does not exist, or replaces it (equivalent to a DROP + CREATE) if the object already exists'
-    DDL_OP_ALTER: DdlRel.DdlOp.ValueType
-    'An operation that modifies the schema (e.g., column names, types, default values) for the target object'
-    DDL_OP_DROP: DdlRel.DdlOp.ValueType
-    'An operation that removes an object from the system'
-    DDL_OP_DROP_IF_EXIST: DdlRel.DdlOp.ValueType
-    'An operation that removes an object from the system (without throwing an exception if the object did not exist)'
-    NAMED_OBJECT_FIELD_NUMBER: builtins.int
-    EXTENSION_OBJECT_FIELD_NUMBER: builtins.int
-    TABLE_SCHEMA_FIELD_NUMBER: builtins.int
-    TABLE_DEFAULTS_FIELD_NUMBER: builtins.int
-    OBJECT_FIELD_NUMBER: builtins.int
-    OP_FIELD_NUMBER: builtins.int
-    VIEW_DEFINITION_FIELD_NUMBER: builtins.int
-
-    @property
-    def named_object(self) -> global___NamedObjectWrite:
-        ...
-
-    @property
-    def extension_object(self) -> global___ExtensionObject:
-        ...
-
-    @property
-    def table_schema(self) -> substrait.ibis.type_pb2.NamedStruct:
-        """The columns that will be modified (representing after-image of a schema change)"""
-
-    @property
-    def table_defaults(self) -> global___Expression.Literal.Struct:
-        """The default values for the columns (representing after-image of a schema change)
-        E.g., in case of an ALTER TABLE that changes some of the column default values, we expect
-        the table_defaults Struct to report a full list of default values reflecting the result of applying
-        the ALTER TABLE operator successfully
-        """
-    object: global___DdlRel.DdlObject.ValueType
-    'Which type of object we operate on'
-    op: global___DdlRel.DdlOp.ValueType
-    'The type of operation to perform'
-
-    @property
-    def view_definition(self) -> global___Rel:
-        """The body of the CREATE VIEW"""
-
-    def __init__(self, *, named_object: global___NamedObjectWrite | None=..., extension_object: global___ExtensionObject | None=..., table_schema: substrait.ibis.type_pb2.NamedStruct | None=..., table_defaults: global___Expression.Literal.Struct | None=..., object: global___DdlRel.DdlObject.ValueType=..., op: global___DdlRel.DdlOp.ValueType=..., view_definition: global___Rel | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['extension_object', b'extension_object', 'named_object', b'named_object', 'table_defaults', b'table_defaults', 'table_schema', b'table_schema', 'view_definition', b'view_definition', 'write_type', b'write_type']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['extension_object', b'extension_object', 'named_object', b'named_object', 'object', b'object', 'op', b'op', 'table_defaults', b'table_defaults', 'table_schema', b'table_schema', 'view_definition', b'view_definition', 'write_type', b'write_type']) -> None:
-        ...
-
-    def WhichOneof(self, oneof_group: typing_extensions.Literal['write_type', b'write_type']) -> typing_extensions.Literal['named_object', 'extension_object'] | None:
-        ...
-global___DdlRel = DdlRel
-
-class WriteRel(google.protobuf.message.Message):
-    """The operator that modifies the content of a database (operates on 1 table at a time, but tuple-selection/source can be
-    based on joining of multiple tables).
-    """
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class _WriteOp:
-        ValueType = typing.NewType('ValueType', builtins.int)
-        V: typing_extensions.TypeAlias = ValueType
-
-    class _WriteOpEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[WriteRel._WriteOp.ValueType], builtins.type):
-        DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-        WRITE_OP_UNSPECIFIED: WriteRel._WriteOp.ValueType
-        WRITE_OP_INSERT: WriteRel._WriteOp.ValueType
-        'The insert of new tuples in a table'
-        WRITE_OP_DELETE: WriteRel._WriteOp.ValueType
-        'The removal of tuples from a table'
-        WRITE_OP_UPDATE: WriteRel._WriteOp.ValueType
-        'The modification of existing tuples within a table'
-        WRITE_OP_CTAS: WriteRel._WriteOp.ValueType
-        'The Creation of a new table, and the insert of new tuples in the table'
-
-    class WriteOp(_WriteOp, metaclass=_WriteOpEnumTypeWrapper):
-        ...
-    WRITE_OP_UNSPECIFIED: WriteRel.WriteOp.ValueType
-    WRITE_OP_INSERT: WriteRel.WriteOp.ValueType
-    'The insert of new tuples in a table'
-    WRITE_OP_DELETE: WriteRel.WriteOp.ValueType
-    'The removal of tuples from a table'
-    WRITE_OP_UPDATE: WriteRel.WriteOp.ValueType
-    'The modification of existing tuples within a table'
-    WRITE_OP_CTAS: WriteRel.WriteOp.ValueType
-    'The Creation of a new table, and the insert of new tuples in the table'
-
-    class _OutputMode:
-        ValueType = typing.NewType('ValueType', builtins.int)
-        V: typing_extensions.TypeAlias = ValueType
-
-    class _OutputModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[WriteRel._OutputMode.ValueType], builtins.type):
-        DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-        OUTPUT_MODE_UNSPECIFIED: WriteRel._OutputMode.ValueType
-        OUTPUT_MODE_NO_OUTPUT: WriteRel._OutputMode.ValueType
-        'return no tuples at all'
-        OUTPUT_MODE_MODIFIED_TUPLES: WriteRel._OutputMode.ValueType
-        'this mode makes the operator return all the tuple INSERTED/DELETED/UPDATED by the operator.\n        The operator returns the AFTER-image of any change. This can be further manipulated by operators upstreams\n        (e.g., retunring the typical "count of modified tuples").\n        For scenarios in which the BEFORE image is required, the user must implement a spool (via references to\n        subplans in the body of the Rel input) and return those with anounter PlanRel.relations.\n        '
-
-    class OutputMode(_OutputMode, metaclass=_OutputModeEnumTypeWrapper):
-        ...
-    OUTPUT_MODE_UNSPECIFIED: WriteRel.OutputMode.ValueType
-    OUTPUT_MODE_NO_OUTPUT: WriteRel.OutputMode.ValueType
-    'return no tuples at all'
-    OUTPUT_MODE_MODIFIED_TUPLES: WriteRel.OutputMode.ValueType
-    'this mode makes the operator return all the tuple INSERTED/DELETED/UPDATED by the operator.\n    The operator returns the AFTER-image of any change. This can be further manipulated by operators upstreams\n    (e.g., retunring the typical "count of modified tuples").\n    For scenarios in which the BEFORE image is required, the user must implement a spool (via references to\n    subplans in the body of the Rel input) and return those with anounter PlanRel.relations.\n    '
-    NAMED_TABLE_FIELD_NUMBER: builtins.int
-    EXTENSION_TABLE_FIELD_NUMBER: builtins.int
-    TABLE_SCHEMA_FIELD_NUMBER: builtins.int
-    OP_FIELD_NUMBER: builtins.int
-    INPUT_FIELD_NUMBER: builtins.int
-    OUTPUT_FIELD_NUMBER: builtins.int
-
-    @property
-    def named_table(self) -> global___NamedObjectWrite:
-        ...
-
-    @property
-    def extension_table(self) -> global___ExtensionObject:
-        ...
-
-    @property
-    def table_schema(self) -> substrait.ibis.type_pb2.NamedStruct:
-        """The schema of the table (must align with Rel input (e.g., number of leaf fields must match))"""
-    op: global___WriteRel.WriteOp.ValueType
-    'The type of operation to perform'
-
-    @property
-    def input(self) -> global___Rel:
-        """The relation that determines the tuples to add/remove/modify
-        the schema must match with table_schema. Default values must be explicitly stated
-        in a ProjectRel at the top of the input. The match must also
-        occur in case of DELETE to ensure multi-engine plans are unequivocal.
-        """
-    output: global___WriteRel.OutputMode.ValueType
-    'Output mode determines what is the output of executing this rel'
-
-    def __init__(self, *, named_table: global___NamedObjectWrite | None=..., extension_table: global___ExtensionObject | None=..., table_schema: substrait.ibis.type_pb2.NamedStruct | None=..., op: global___WriteRel.WriteOp.ValueType=..., input: global___Rel | None=..., output: global___WriteRel.OutputMode.ValueType=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['extension_table', b'extension_table', 'input', b'input', 'named_table', b'named_table', 'table_schema', b'table_schema', 'write_type', b'write_type']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['extension_table', b'extension_table', 'input', b'input', 'named_table', b'named_table', 'op', b'op', 'output', b'output', 'table_schema', b'table_schema', 'write_type', b'write_type']) -> None:
-        ...
-
-    def WhichOneof(self, oneof_group: typing_extensions.Literal['write_type', b'write_type']) -> typing_extensions.Literal['named_table', 'extension_table'] | None:
-        ...
-global___WriteRel = WriteRel
-
-class HashJoinRel(google.protobuf.message.Message):
-    """The hash equijoin join operator will build a hash table out of the right input based on a set of join keys.
-    It will then probe that hash table for incoming inputs, finding matches.
-    """
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class _JoinType:
-        ValueType = typing.NewType('ValueType', builtins.int)
-        V: typing_extensions.TypeAlias = ValueType
-
-    class _JoinTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[HashJoinRel._JoinType.ValueType], builtins.type):
-        DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-        JOIN_TYPE_UNSPECIFIED: HashJoinRel._JoinType.ValueType
-        JOIN_TYPE_INNER: HashJoinRel._JoinType.ValueType
-        JOIN_TYPE_OUTER: HashJoinRel._JoinType.ValueType
-        JOIN_TYPE_LEFT: HashJoinRel._JoinType.ValueType
-        JOIN_TYPE_RIGHT: HashJoinRel._JoinType.ValueType
-        JOIN_TYPE_LEFT_SEMI: HashJoinRel._JoinType.ValueType
-        JOIN_TYPE_RIGHT_SEMI: HashJoinRel._JoinType.ValueType
-        JOIN_TYPE_LEFT_ANTI: HashJoinRel._JoinType.ValueType
-        JOIN_TYPE_RIGHT_ANTI: HashJoinRel._JoinType.ValueType
-
-    class JoinType(_JoinType, metaclass=_JoinTypeEnumTypeWrapper):
-        ...
-    JOIN_TYPE_UNSPECIFIED: HashJoinRel.JoinType.ValueType
-    JOIN_TYPE_INNER: HashJoinRel.JoinType.ValueType
-    JOIN_TYPE_OUTER: HashJoinRel.JoinType.ValueType
-    JOIN_TYPE_LEFT: HashJoinRel.JoinType.ValueType
-    JOIN_TYPE_RIGHT: HashJoinRel.JoinType.ValueType
-    JOIN_TYPE_LEFT_SEMI: HashJoinRel.JoinType.ValueType
-    JOIN_TYPE_RIGHT_SEMI: HashJoinRel.JoinType.ValueType
-    JOIN_TYPE_LEFT_ANTI: HashJoinRel.JoinType.ValueType
-    JOIN_TYPE_RIGHT_ANTI: HashJoinRel.JoinType.ValueType
-    COMMON_FIELD_NUMBER: builtins.int
-    LEFT_FIELD_NUMBER: builtins.int
-    RIGHT_FIELD_NUMBER: builtins.int
-    LEFT_KEYS_FIELD_NUMBER: builtins.int
-    RIGHT_KEYS_FIELD_NUMBER: builtins.int
-    POST_JOIN_FILTER_FIELD_NUMBER: builtins.int
-    TYPE_FIELD_NUMBER: builtins.int
-    ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-
-    @property
-    def common(self) -> global___RelCommon:
-        ...
-
-    @property
-    def left(self) -> global___Rel:
-        ...
-
-    @property
-    def right(self) -> global___Rel:
-        ...
-
-    @property
-    def left_keys(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression.FieldReference]:
-        ...
-
-    @property
-    def right_keys(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression.FieldReference]:
-        ...
-
-    @property
-    def post_join_filter(self) -> global___Expression:
-        ...
-    type: global___HashJoinRel.JoinType.ValueType
-
-    @property
-    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-        ...
-
-    def __init__(self, *, common: global___RelCommon | None=..., left: global___Rel | None=..., right: global___Rel | None=..., left_keys: collections.abc.Iterable[global___Expression.FieldReference] | None=..., right_keys: collections.abc.Iterable[global___Expression.FieldReference] | None=..., post_join_filter: global___Expression | None=..., type: global___HashJoinRel.JoinType.ValueType=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'left', b'left', 'post_join_filter', b'post_join_filter', 'right', b'right']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'left', b'left', 'left_keys', b'left_keys', 'post_join_filter', b'post_join_filter', 'right', b'right', 'right_keys', b'right_keys', 'type', b'type']) -> None:
-        ...
-global___HashJoinRel = HashJoinRel
-
-class MergeJoinRel(google.protobuf.message.Message):
-    """The merge equijoin does a join by taking advantage of two sets that are sorted on the join keys.
-    This allows the join operation to be done in a streaming fashion.
-    """
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class _JoinType:
-        ValueType = typing.NewType('ValueType', builtins.int)
-        V: typing_extensions.TypeAlias = ValueType
-
-    class _JoinTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[MergeJoinRel._JoinType.ValueType], builtins.type):
-        DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-        JOIN_TYPE_UNSPECIFIED: MergeJoinRel._JoinType.ValueType
-        JOIN_TYPE_INNER: MergeJoinRel._JoinType.ValueType
-        JOIN_TYPE_OUTER: MergeJoinRel._JoinType.ValueType
-        JOIN_TYPE_LEFT: MergeJoinRel._JoinType.ValueType
-        JOIN_TYPE_RIGHT: MergeJoinRel._JoinType.ValueType
-        JOIN_TYPE_LEFT_SEMI: MergeJoinRel._JoinType.ValueType
-        JOIN_TYPE_RIGHT_SEMI: MergeJoinRel._JoinType.ValueType
-        JOIN_TYPE_LEFT_ANTI: MergeJoinRel._JoinType.ValueType
-        JOIN_TYPE_RIGHT_ANTI: MergeJoinRel._JoinType.ValueType
-
-    class JoinType(_JoinType, metaclass=_JoinTypeEnumTypeWrapper):
-        ...
-    JOIN_TYPE_UNSPECIFIED: MergeJoinRel.JoinType.ValueType
-    JOIN_TYPE_INNER: MergeJoinRel.JoinType.ValueType
-    JOIN_TYPE_OUTER: MergeJoinRel.JoinType.ValueType
-    JOIN_TYPE_LEFT: MergeJoinRel.JoinType.ValueType
-    JOIN_TYPE_RIGHT: MergeJoinRel.JoinType.ValueType
-    JOIN_TYPE_LEFT_SEMI: MergeJoinRel.JoinType.ValueType
-    JOIN_TYPE_RIGHT_SEMI: MergeJoinRel.JoinType.ValueType
-    JOIN_TYPE_LEFT_ANTI: MergeJoinRel.JoinType.ValueType
-    JOIN_TYPE_RIGHT_ANTI: MergeJoinRel.JoinType.ValueType
-    COMMON_FIELD_NUMBER: builtins.int
-    LEFT_FIELD_NUMBER: builtins.int
-    RIGHT_FIELD_NUMBER: builtins.int
-    LEFT_KEYS_FIELD_NUMBER: builtins.int
-    RIGHT_KEYS_FIELD_NUMBER: builtins.int
-    POST_JOIN_FILTER_FIELD_NUMBER: builtins.int
-    TYPE_FIELD_NUMBER: builtins.int
-    ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
-
-    @property
-    def common(self) -> global___RelCommon:
-        ...
-
-    @property
-    def left(self) -> global___Rel:
-        ...
-
-    @property
-    def right(self) -> global___Rel:
-        ...
-
-    @property
-    def left_keys(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression.FieldReference]:
-        ...
-
-    @property
-    def right_keys(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression.FieldReference]:
-        ...
-
-    @property
-    def post_join_filter(self) -> global___Expression:
-        ...
-    type: global___MergeJoinRel.JoinType.ValueType
-
-    @property
-    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-        ...
-
-    def __init__(self, *, common: global___RelCommon | None=..., left: global___Rel | None=..., right: global___Rel | None=..., left_keys: collections.abc.Iterable[global___Expression.FieldReference] | None=..., right_keys: collections.abc.Iterable[global___Expression.FieldReference] | None=..., post_join_filter: global___Expression | None=..., type: global___MergeJoinRel.JoinType.ValueType=..., advanced_extension: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'left', b'left', 'post_join_filter', b'post_join_filter', 'right', b'right']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'left', b'left', 'left_keys', b'left_keys', 'post_join_filter', b'post_join_filter', 'right', b'right', 'right_keys', b'right_keys', 'type', b'type']) -> None:
-        ...
-global___MergeJoinRel = MergeJoinRel
-
-class FunctionArgument(google.protobuf.message.Message):
-    """The argument of a function"""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    ENUM_FIELD_NUMBER: builtins.int
-    TYPE_FIELD_NUMBER: builtins.int
-    VALUE_FIELD_NUMBER: builtins.int
-    enum: builtins.str
-
-    @property
-    def type(self) -> substrait.ibis.type_pb2.Type:
-        ...
-
-    @property
-    def value(self) -> global___Expression:
-        ...
-
-    def __init__(self, *, enum: builtins.str=..., type: substrait.ibis.type_pb2.Type | None=..., value: global___Expression | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['arg_type', b'arg_type', 'enum', b'enum', 'type', b'type', 'value', b'value']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['arg_type', b'arg_type', 'enum', b'enum', 'type', b'type', 'value', b'value']) -> None:
-        ...
-
-    def WhichOneof(self, oneof_group: typing_extensions.Literal['arg_type', b'arg_type']) -> typing_extensions.Literal['enum', 'type', 'value'] | None:
-        ...
-global___FunctionArgument = FunctionArgument
-
-class FunctionOption(google.protobuf.message.Message):
-    """An optional function argument.  Typically used for specifying behavior in
-    invalid or corner cases.
-    """
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    NAME_FIELD_NUMBER: builtins.int
-    PREFERENCE_FIELD_NUMBER: builtins.int
-    name: builtins.str
-    'Name of the option to set. If the consumer does not recognize the\n    option, it must reject the plan. The name is matched case-insensitively\n    with option names defined for the function.\n    '
-
-    @property
-    def preference(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-        """List of behavior options allowed by the producer. At least one must be
-        specified; to leave an option unspecified, simply don't add an entry to
-        `options`. The consumer must use the first option from the list that it
-        supports. If the consumer supports none of the specified options, it
-        must reject the plan. The name is matched case-insensitively and must
-        match one of the option values defined for the option.
-        """
-
-    def __init__(self, *, name: builtins.str=..., preference: collections.abc.Iterable[builtins.str] | None=...) -> None:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['name', b'name', 'preference', b'preference']) -> None:
-        ...
-global___FunctionOption = FunctionOption
-
-class Expression(google.protobuf.message.Message):
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class Enum(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class Empty(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-            def __init__(self) -> None:
-                ...
-        SPECIFIED_FIELD_NUMBER: builtins.int
-        UNSPECIFIED_FIELD_NUMBER: builtins.int
-        specified: builtins.str
-
-        @property
-        def unspecified(self) -> global___Expression.Enum.Empty:
-            ...
-
-        def __init__(self, *, specified: builtins.str=..., unspecified: global___Expression.Enum.Empty | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['enum_kind', b'enum_kind', 'specified', b'specified', 'unspecified', b'unspecified']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['enum_kind', b'enum_kind', 'specified', b'specified', 'unspecified', b'unspecified']) -> None:
-            ...
-
-        def WhichOneof(self, oneof_group: typing_extensions.Literal['enum_kind', b'enum_kind']) -> typing_extensions.Literal['specified', 'unspecified'] | None:
-            ...
-
-    class Literal(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class VarChar(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            VALUE_FIELD_NUMBER: builtins.int
-            LENGTH_FIELD_NUMBER: builtins.int
-            value: builtins.str
-            length: builtins.int
-
-            def __init__(self, *, value: builtins.str=..., length: builtins.int=...) -> None:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['length', b'length', 'value', b'value']) -> None:
-                ...
-
-        class Decimal(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            VALUE_FIELD_NUMBER: builtins.int
-            PRECISION_FIELD_NUMBER: builtins.int
-            SCALE_FIELD_NUMBER: builtins.int
-            value: builtins.bytes
-            'little-endian twos-complement integer representation of complete value\n            (ignoring precision) Always 16 bytes in length\n            '
-            precision: builtins.int
-            'The maximum number of digits allowed in the value.\n            the maximum precision is 38.\n            '
-            scale: builtins.int
-            'declared scale of decimal literal'
-
-            def __init__(self, *, value: builtins.bytes=..., precision: builtins.int=..., scale: builtins.int=...) -> None:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['precision', b'precision', 'scale', b'scale', 'value', b'value']) -> None:
-                ...
-
-        class Map(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-            class KeyValue(google.protobuf.message.Message):
-                DESCRIPTOR: google.protobuf.descriptor.Descriptor
-                KEY_FIELD_NUMBER: builtins.int
-                VALUE_FIELD_NUMBER: builtins.int
-
-                @property
-                def key(self) -> global___Expression.Literal:
-                    ...
-
-                @property
-                def value(self) -> global___Expression.Literal:
-                    ...
-
-                def __init__(self, *, key: global___Expression.Literal | None=..., value: global___Expression.Literal | None=...) -> None:
-                    ...
-
-                def HasField(self, field_name: typing_extensions.Literal['key', b'key', 'value', b'value']) -> builtins.bool:
-                    ...
-
-                def ClearField(self, field_name: typing_extensions.Literal['key', b'key', 'value', b'value']) -> None:
-                    ...
-            KEY_VALUES_FIELD_NUMBER: builtins.int
-
-            @property
-            def key_values(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression.Literal.Map.KeyValue]:
-                ...
-
-            def __init__(self, *, key_values: collections.abc.Iterable[global___Expression.Literal.Map.KeyValue] | None=...) -> None:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['key_values', b'key_values']) -> None:
-                ...
-
-        class IntervalYearToMonth(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            YEARS_FIELD_NUMBER: builtins.int
-            MONTHS_FIELD_NUMBER: builtins.int
-            years: builtins.int
-            months: builtins.int
-
-            def __init__(self, *, years: builtins.int=..., months: builtins.int=...) -> None:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['months', b'months', 'years', b'years']) -> None:
-                ...
-
-        class IntervalDayToSecond(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            DAYS_FIELD_NUMBER: builtins.int
-            SECONDS_FIELD_NUMBER: builtins.int
-            MICROSECONDS_FIELD_NUMBER: builtins.int
-            days: builtins.int
-            seconds: builtins.int
-            microseconds: builtins.int
-
-            def __init__(self, *, days: builtins.int=..., seconds: builtins.int=..., microseconds: builtins.int=...) -> None:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['days', b'days', 'microseconds', b'microseconds', 'seconds', b'seconds']) -> None:
-                ...
-
-        class Struct(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            FIELDS_FIELD_NUMBER: builtins.int
-
-            @property
-            def fields(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression.Literal]:
-                """A possibly heterogeneously typed list of literals"""
-
-            def __init__(self, *, fields: collections.abc.Iterable[global___Expression.Literal] | None=...) -> None:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['fields', b'fields']) -> None:
-                ...
-
-        class List(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            VALUES_FIELD_NUMBER: builtins.int
-
-            @property
-            def values(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression.Literal]:
-                """A homogeneously typed list of literals"""
-
-            def __init__(self, *, values: collections.abc.Iterable[global___Expression.Literal] | None=...) -> None:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['values', b'values']) -> None:
-                ...
-
-        class UserDefined(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            TYPE_REFERENCE_FIELD_NUMBER: builtins.int
-            TYPE_PARAMETERS_FIELD_NUMBER: builtins.int
-            VALUE_FIELD_NUMBER: builtins.int
-            type_reference: builtins.int
-            'points to a type_anchor defined in this plan'
-
-            @property
-            def type_parameters(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[substrait.ibis.type_pb2.Type.Parameter]:
-                """The parameters to be bound to the type class, if the type class is
-                parameterizable.
-                """
-
-            @property
-            def value(self) -> google.protobuf.any_pb2.Any:
-                """the value of the literal, serialized using some type-specific
-                protobuf message
-                """
-
-            def __init__(self, *, type_reference: builtins.int=..., type_parameters: collections.abc.Iterable[substrait.ibis.type_pb2.Type.Parameter] | None=..., value: google.protobuf.any_pb2.Any | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['value', b'value']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['type_parameters', b'type_parameters', 'type_reference', b'type_reference', 'value', b'value']) -> None:
-                ...
-        BOOLEAN_FIELD_NUMBER: builtins.int
-        I8_FIELD_NUMBER: builtins.int
-        I16_FIELD_NUMBER: builtins.int
-        I32_FIELD_NUMBER: builtins.int
-        I64_FIELD_NUMBER: builtins.int
-        FP32_FIELD_NUMBER: builtins.int
-        FP64_FIELD_NUMBER: builtins.int
-        STRING_FIELD_NUMBER: builtins.int
-        BINARY_FIELD_NUMBER: builtins.int
-        TIMESTAMP_FIELD_NUMBER: builtins.int
-        DATE_FIELD_NUMBER: builtins.int
-        TIME_FIELD_NUMBER: builtins.int
-        INTERVAL_YEAR_TO_MONTH_FIELD_NUMBER: builtins.int
-        INTERVAL_DAY_TO_SECOND_FIELD_NUMBER: builtins.int
-        FIXED_CHAR_FIELD_NUMBER: builtins.int
-        VAR_CHAR_FIELD_NUMBER: builtins.int
-        FIXED_BINARY_FIELD_NUMBER: builtins.int
-        DECIMAL_FIELD_NUMBER: builtins.int
-        STRUCT_FIELD_NUMBER: builtins.int
-        MAP_FIELD_NUMBER: builtins.int
-        TIMESTAMP_TZ_FIELD_NUMBER: builtins.int
-        UUID_FIELD_NUMBER: builtins.int
-        NULL_FIELD_NUMBER: builtins.int
-        LIST_FIELD_NUMBER: builtins.int
-        EMPTY_LIST_FIELD_NUMBER: builtins.int
-        EMPTY_MAP_FIELD_NUMBER: builtins.int
-        USER_DEFINED_FIELD_NUMBER: builtins.int
-        NULLABLE_FIELD_NUMBER: builtins.int
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        boolean: builtins.bool
-        i8: builtins.int
-        i16: builtins.int
-        i32: builtins.int
-        i64: builtins.int
-        fp32: builtins.float
-        fp64: builtins.float
-        string: builtins.str
-        binary: builtins.bytes
-        timestamp: builtins.int
-        'Timestamp in units of microseconds since the UNIX epoch.'
-        date: builtins.int
-        'Date in units of days since the UNIX epoch.'
-        time: builtins.int
-        'Time in units of microseconds past midnight'
-
-        @property
-        def interval_year_to_month(self) -> global___Expression.Literal.IntervalYearToMonth:
-            ...
-
-        @property
-        def interval_day_to_second(self) -> global___Expression.Literal.IntervalDayToSecond:
-            ...
-        fixed_char: builtins.str
-
-        @property
-        def var_char(self) -> global___Expression.Literal.VarChar:
-            ...
-        fixed_binary: builtins.bytes
-
-        @property
-        def decimal(self) -> global___Expression.Literal.Decimal:
-            ...
-
-        @property
-        def struct(self) -> global___Expression.Literal.Struct:
-            ...
-
-        @property
-        def map(self) -> global___Expression.Literal.Map:
-            ...
-        timestamp_tz: builtins.int
-        'Timestamp in units of microseconds since the UNIX epoch.'
-        uuid: builtins.bytes
-
-        @property
-        def null(self) -> substrait.ibis.type_pb2.Type:
-            """a typed null literal"""
-
-        @property
-        def list(self) -> global___Expression.Literal.List:
-            ...
-
-        @property
-        def empty_list(self) -> substrait.ibis.type_pb2.Type.List:
-            ...
-
-        @property
-        def empty_map(self) -> substrait.ibis.type_pb2.Type.Map:
-            ...
-
-        @property
-        def user_defined(self) -> global___Expression.Literal.UserDefined:
-            ...
-        nullable: builtins.bool
-        'whether the literal type should be treated as a nullable type. Applies to\n        all members of union other than the Typed null (which should directly\n        declare nullability).\n        '
-        type_variation_reference: builtins.int
-        'optionally points to a type_variation_anchor defined in this plan.\n        Applies to all members of union other than the Typed null (which should\n        directly declare the type variation).\n        '
-
-        def __init__(self, *, boolean: builtins.bool=..., i8: builtins.int=..., i16: builtins.int=..., i32: builtins.int=..., i64: builtins.int=..., fp32: builtins.float=..., fp64: builtins.float=..., string: builtins.str=..., binary: builtins.bytes=..., timestamp: builtins.int=..., date: builtins.int=..., time: builtins.int=..., interval_year_to_month: global___Expression.Literal.IntervalYearToMonth | None=..., interval_day_to_second: global___Expression.Literal.IntervalDayToSecond | None=..., fixed_char: builtins.str=..., var_char: global___Expression.Literal.VarChar | None=..., fixed_binary: builtins.bytes=..., decimal: global___Expression.Literal.Decimal | None=..., struct: global___Expression.Literal.Struct | None=..., map: global___Expression.Literal.Map | None=..., timestamp_tz: builtins.int=..., uuid: builtins.bytes=..., null: substrait.ibis.type_pb2.Type | None=..., list: global___Expression.Literal.List | None=..., empty_list: substrait.ibis.type_pb2.Type.List | None=..., empty_map: substrait.ibis.type_pb2.Type.Map | None=..., user_defined: global___Expression.Literal.UserDefined | None=..., nullable: builtins.bool=..., type_variation_reference: builtins.int=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['binary', b'binary', 'boolean', b'boolean', 'date', b'date', 'decimal', b'decimal', 'empty_list', b'empty_list', 'empty_map', b'empty_map', 'fixed_binary', b'fixed_binary', 'fixed_char', b'fixed_char', 'fp32', b'fp32', 'fp64', b'fp64', 'i16', b'i16', 'i32', b'i32', 'i64', b'i64', 'i8', b'i8', 'interval_day_to_second', b'interval_day_to_second', 'interval_year_to_month', b'interval_year_to_month', 'list', b'list', 'literal_type', b'literal_type', 'map', b'map', 'null', b'null', 'string', b'string', 'struct', b'struct', 'time', b'time', 'timestamp', b'timestamp', 'timestamp_tz', b'timestamp_tz', 'user_defined', b'user_defined', 'uuid', b'uuid', 'var_char', b'var_char']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['binary', b'binary', 'boolean', b'boolean', 'date', b'date', 'decimal', b'decimal', 'empty_list', b'empty_list', 'empty_map', b'empty_map', 'fixed_binary', b'fixed_binary', 'fixed_char', b'fixed_char', 'fp32', b'fp32', 'fp64', b'fp64', 'i16', b'i16', 'i32', b'i32', 'i64', b'i64', 'i8', b'i8', 'interval_day_to_second', b'interval_day_to_second', 'interval_year_to_month', b'interval_year_to_month', 'list', b'list', 'literal_type', b'literal_type', 'map', b'map', 'null', b'null', 'nullable', b'nullable', 'string', b'string', 'struct', b'struct', 'time', b'time', 'timestamp', b'timestamp', 'timestamp_tz', b'timestamp_tz', 'type_variation_reference', b'type_variation_reference', 'user_defined', b'user_defined', 'uuid', b'uuid', 'var_char', b'var_char']) -> None:
-            ...
-
-        def WhichOneof(self, oneof_group: typing_extensions.Literal['literal_type', b'literal_type']) -> typing_extensions.Literal['boolean', 'i8', 'i16', 'i32', 'i64', 'fp32', 'fp64', 'string', 'binary', 'timestamp', 'date', 'time', 'interval_year_to_month', 'interval_day_to_second', 'fixed_char', 'var_char', 'fixed_binary', 'decimal', 'struct', 'map', 'timestamp_tz', 'uuid', 'null', 'list', 'empty_list', 'empty_map', 'user_defined'] | None:
-            ...
-
-    class Nested(google.protobuf.message.Message):
-        """Expression to dynamically construct nested types."""
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class Map(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-            class KeyValue(google.protobuf.message.Message):
-                DESCRIPTOR: google.protobuf.descriptor.Descriptor
-                KEY_FIELD_NUMBER: builtins.int
-                VALUE_FIELD_NUMBER: builtins.int
-
-                @property
-                def key(self) -> global___Expression:
-                    """Mandatory key/value expressions."""
-
-                @property
-                def value(self) -> global___Expression:
-                    ...
-
-                def __init__(self, *, key: global___Expression | None=..., value: global___Expression | None=...) -> None:
-                    ...
-
-                def HasField(self, field_name: typing_extensions.Literal['key', b'key', 'value', b'value']) -> builtins.bool:
-                    ...
-
-                def ClearField(self, field_name: typing_extensions.Literal['key', b'key', 'value', b'value']) -> None:
-                    ...
-            KEY_VALUES_FIELD_NUMBER: builtins.int
-
-            @property
-            def key_values(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression.Nested.Map.KeyValue]:
-                """One or more key-value pairs. To specify an empty map, use
-                Literal.empty_map (otherwise type information would be missing).
-                """
-
-            def __init__(self, *, key_values: collections.abc.Iterable[global___Expression.Nested.Map.KeyValue] | None=...) -> None:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['key_values', b'key_values']) -> None:
-                ...
-
-        class Struct(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            FIELDS_FIELD_NUMBER: builtins.int
-
-            @property
-            def fields(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression]:
-                """Zero or more possibly heterogeneously-typed list of expressions that
-                form the struct fields.
-                """
-
-            def __init__(self, *, fields: collections.abc.Iterable[global___Expression] | None=...) -> None:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['fields', b'fields']) -> None:
-                ...
-
-        class List(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            VALUES_FIELD_NUMBER: builtins.int
-
-            @property
-            def values(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression]:
-                """A homogeneously-typed list of one or more expressions that form the
-                list entries. To specify an empty list, use Literal.empty_list
-                (otherwise type information would be missing).
-                """
-
-            def __init__(self, *, values: collections.abc.Iterable[global___Expression] | None=...) -> None:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['values', b'values']) -> None:
-                ...
-        NULLABLE_FIELD_NUMBER: builtins.int
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        STRUCT_FIELD_NUMBER: builtins.int
-        LIST_FIELD_NUMBER: builtins.int
-        MAP_FIELD_NUMBER: builtins.int
-        nullable: builtins.bool
-        'Whether the returned nested type is nullable.'
-        type_variation_reference: builtins.int
-        'Optionally points to a type_variation_anchor defined in this plan for\n        the returned nested type.\n        '
-
-        @property
-        def struct(self) -> global___Expression.Nested.Struct:
-            ...
-
-        @property
-        def list(self) -> global___Expression.Nested.List:
-            ...
-
-        @property
-        def map(self) -> global___Expression.Nested.Map:
-            ...
-
-        def __init__(self, *, nullable: builtins.bool=..., type_variation_reference: builtins.int=..., struct: global___Expression.Nested.Struct | None=..., list: global___Expression.Nested.List | None=..., map: global___Expression.Nested.Map | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['list', b'list', 'map', b'map', 'nested_type', b'nested_type', 'struct', b'struct']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['list', b'list', 'map', b'map', 'nested_type', b'nested_type', 'nullable', b'nullable', 'struct', b'struct', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-        def WhichOneof(self, oneof_group: typing_extensions.Literal['nested_type', b'nested_type']) -> typing_extensions.Literal['struct', 'list', 'map'] | None:
-            ...
-
-    class ScalarFunction(google.protobuf.message.Message):
-        """A scalar function call."""
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        FUNCTION_REFERENCE_FIELD_NUMBER: builtins.int
-        ARGUMENTS_FIELD_NUMBER: builtins.int
-        OPTIONS_FIELD_NUMBER: builtins.int
-        OUTPUT_TYPE_FIELD_NUMBER: builtins.int
-        ARGS_FIELD_NUMBER: builtins.int
-        function_reference: builtins.int
-        'Points to a function_anchor defined in this plan, which must refer\n        to a scalar function in the associated YAML file. Required; avoid\n        using anchor/reference zero.\n        '
-
-        @property
-        def arguments(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FunctionArgument]:
-            """The arguments to be bound to the function. This must have exactly the
-            number of arguments specified in the function definition, and the
-            argument types must also match exactly:
-
-             - Value arguments must be bound using FunctionArgument.value, and
-               the expression in that must yield a value of a type that a function
-               overload is defined for.
-             - Type arguments must be bound using FunctionArgument.type.
-             - Enum arguments must be bound using FunctionArgument.enum
-               followed by Enum.specified, with a string that case-insensitively
-               matches one of the allowed options.
-            """
-
-        @property
-        def options(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FunctionOption]:
-            """Options to specify behavior for corner cases, or leave behavior
-            unspecified if the consumer does not need specific behavior in these
-            cases.
-            """
-
-        @property
-        def output_type(self) -> substrait.ibis.type_pb2.Type:
-            """Must be set to the return type of the function, exactly as derived
-            using the declaration in the extension.
-            """
-
-        @property
-        def args(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression]:
-            """Deprecated; use arguments instead."""
-
-        def __init__(self, *, function_reference: builtins.int=..., arguments: collections.abc.Iterable[global___FunctionArgument] | None=..., options: collections.abc.Iterable[global___FunctionOption] | None=..., output_type: substrait.ibis.type_pb2.Type | None=..., args: collections.abc.Iterable[global___Expression] | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['output_type', b'output_type']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['args', b'args', 'arguments', b'arguments', 'function_reference', b'function_reference', 'options', b'options', 'output_type', b'output_type']) -> None:
-            ...
-
-    class WindowFunction(google.protobuf.message.Message):
-        """A window function call."""
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class Bound(google.protobuf.message.Message):
-            """Defines one of the two boundaries for the window of a window function."""
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-            class Preceding(google.protobuf.message.Message):
-                """Defines that the bound extends this far back from the current record."""
-                DESCRIPTOR: google.protobuf.descriptor.Descriptor
-                OFFSET_FIELD_NUMBER: builtins.int
-                offset: builtins.int
-                'A strictly positive integer specifying the number of records that\n                the window extends back from the current record. Required. Use\n                CurrentRow for offset zero and Following for negative offsets.\n                '
-
-                def __init__(self, *, offset: builtins.int=...) -> None:
-                    ...
-
-                def ClearField(self, field_name: typing_extensions.Literal['offset', b'offset']) -> None:
-                    ...
-
-            class Following(google.protobuf.message.Message):
-                """Defines that the bound extends this far ahead of the current record."""
-                DESCRIPTOR: google.protobuf.descriptor.Descriptor
-                OFFSET_FIELD_NUMBER: builtins.int
-                offset: builtins.int
-                'A strictly positive integer specifying the number of records that\n                the window extends ahead of the current record. Required. Use\n                CurrentRow for offset zero and Preceding for negative offsets.\n                '
-
-                def __init__(self, *, offset: builtins.int=...) -> None:
-                    ...
-
-                def ClearField(self, field_name: typing_extensions.Literal['offset', b'offset']) -> None:
-                    ...
-
-            class CurrentRow(google.protobuf.message.Message):
-                """Defines that the bound extends to or from the current record."""
-                DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-                def __init__(self) -> None:
-                    ...
-
-            class Unbounded(google.protobuf.message.Message):
-                """Defines an "unbounded bound": for lower bounds this means the start
-                of the partition, and for upper bounds this means the end of the
-                partition.
-                """
-                DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-                def __init__(self) -> None:
-                    ...
-            PRECEDING_FIELD_NUMBER: builtins.int
-            FOLLOWING_FIELD_NUMBER: builtins.int
-            CURRENT_ROW_FIELD_NUMBER: builtins.int
-            UNBOUNDED_FIELD_NUMBER: builtins.int
-
-            @property
-            def preceding(self) -> global___Expression.WindowFunction.Bound.Preceding:
-                """The bound extends some number of records behind the current record."""
-
-            @property
-            def following(self) -> global___Expression.WindowFunction.Bound.Following:
-                """The bound extends some number of records ahead of the current
-                record.
-                """
-
-            @property
-            def current_row(self) -> global___Expression.WindowFunction.Bound.CurrentRow:
-                """The bound extends to the current record."""
-
-            @property
-            def unbounded(self) -> global___Expression.WindowFunction.Bound.Unbounded:
-                """The bound extends to the start of the partition or the end of the
-                partition, depending on whether this represents the upper or lower
-                bound.
-                """
-
-            def __init__(self, *, preceding: global___Expression.WindowFunction.Bound.Preceding | None=..., following: global___Expression.WindowFunction.Bound.Following | None=..., current_row: global___Expression.WindowFunction.Bound.CurrentRow | None=..., unbounded: global___Expression.WindowFunction.Bound.Unbounded | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['current_row', b'current_row', 'following', b'following', 'kind', b'kind', 'preceding', b'preceding', 'unbounded', b'unbounded']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['current_row', b'current_row', 'following', b'following', 'kind', b'kind', 'preceding', b'preceding', 'unbounded', b'unbounded']) -> None:
-                ...
-
-            def WhichOneof(self, oneof_group: typing_extensions.Literal['kind', b'kind']) -> typing_extensions.Literal['preceding', 'following', 'current_row', 'unbounded'] | None:
-                ...
-        FUNCTION_REFERENCE_FIELD_NUMBER: builtins.int
-        ARGUMENTS_FIELD_NUMBER: builtins.int
-        OPTIONS_FIELD_NUMBER: builtins.int
-        OUTPUT_TYPE_FIELD_NUMBER: builtins.int
-        PHASE_FIELD_NUMBER: builtins.int
-        SORTS_FIELD_NUMBER: builtins.int
-        INVOCATION_FIELD_NUMBER: builtins.int
-        PARTITIONS_FIELD_NUMBER: builtins.int
-        LOWER_BOUND_FIELD_NUMBER: builtins.int
-        UPPER_BOUND_FIELD_NUMBER: builtins.int
-        ARGS_FIELD_NUMBER: builtins.int
-        function_reference: builtins.int
-        'Points to a function_anchor defined in this plan, which must refer\n        to a window function in the associated YAML file. Required; 0 is\n        considered to be a valid anchor/reference.\n        '
-
-        @property
-        def arguments(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FunctionArgument]:
-            """The arguments to be bound to the function. This must have exactly the
-            number of arguments specified in the function definition, and the
-            argument types must also match exactly:
-
-             - Value arguments must be bound using FunctionArgument.value, and
-               the expression in that must yield a value of a type that a function
-               overload is defined for.
-             - Type arguments must be bound using FunctionArgument.type, and a
-               function overload must be defined for that type.
-             - Enum arguments must be bound using FunctionArgument.enum
-               followed by Enum.specified, with a string that case-insensitively
-               matches one of the allowed options.
-            """
-
-        @property
-        def options(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FunctionOption]:
-            """Options to specify behavior for corner cases, or leave behavior
-            unspecified if the consumer does not need specific behavior in these
-            cases.
-            """
-
-        @property
-        def output_type(self) -> substrait.ibis.type_pb2.Type:
-            """Must be set to the return type of the function, exactly as derived
-            using the declaration in the extension.
-            """
-        phase: global___AggregationPhase.ValueType
-        'Describes which part of the window function to perform within the\n        context of distributed algorithms. Required. Must be set to\n        INITIAL_TO_RESULT for window functions that are not decomposable.\n        '
-
-        @property
-        def sorts(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___SortField]:
-            """If specified, the records that are part of the window defined by
-            upper_bound and lower_bound are ordered according to this list
-            before they are aggregated. The first sort field has the highest
-            priority; only if a sort field determines two records to be equivalent
-            is the next field queried. This field is optional, and is only allowed
-            if the window function is defined to support sorting.
-            """
-        invocation: global___AggregateFunction.AggregationInvocation.ValueType
-        'Specifies whether equivalent records are merged before being aggregated.\n        Optional, defaults to AGGREGATION_INVOCATION_ALL.\n        '
-
-        @property
-        def partitions(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression]:
-            """When one or more partition expressions are specified, two records are
-            considered to be in the same partition if and only if these expressions
-            yield an equal tuple of values for both. When computing the window
-            function, only the subset of records within the bounds that are also in
-            the same partition as the current record are aggregated.
-            """
-
-        @property
-        def lower_bound(self) -> global___Expression.WindowFunction.Bound:
-            """Defines the record relative to the current record from which the window
-            extends. The bound is inclusive. If the lower bound indexes a record
-            greater than the upper bound, TODO (null range/no records passed?
-            wrapping around as if lower/upper were swapped? error? null?).
-            Optional; defaults to the start of the partition.
-            """
-
-        @property
-        def upper_bound(self) -> global___Expression.WindowFunction.Bound:
-            """Defines the record relative to the current record up to which the window
-            extends. The bound is inclusive. If the upper bound indexes a record
-            less than the lower bound, TODO (null range/no records passed?
-            wrapping around as if lower/upper were swapped? error? null?).
-            Optional; defaults to the end of the partition.
-            """
-
-        @property
-        def args(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression]:
-            """Deprecated; use arguments instead."""
-
-        def __init__(self, *, function_reference: builtins.int=..., arguments: collections.abc.Iterable[global___FunctionArgument] | None=..., options: collections.abc.Iterable[global___FunctionOption] | None=..., output_type: substrait.ibis.type_pb2.Type | None=..., phase: global___AggregationPhase.ValueType=..., sorts: collections.abc.Iterable[global___SortField] | None=..., invocation: global___AggregateFunction.AggregationInvocation.ValueType=..., partitions: collections.abc.Iterable[global___Expression] | None=..., lower_bound: global___Expression.WindowFunction.Bound | None=..., upper_bound: global___Expression.WindowFunction.Bound | None=..., args: collections.abc.Iterable[global___Expression] | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['lower_bound', b'lower_bound', 'output_type', b'output_type', 'upper_bound', b'upper_bound']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['args', b'args', 'arguments', b'arguments', 'function_reference', b'function_reference', 'invocation', b'invocation', 'lower_bound', b'lower_bound', 'options', b'options', 'output_type', b'output_type', 'partitions', b'partitions', 'phase', b'phase', 'sorts', b'sorts', 'upper_bound', b'upper_bound']) -> None:
-            ...
-
-    class IfThen(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class IfClause(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            IF_FIELD_NUMBER: builtins.int
-            THEN_FIELD_NUMBER: builtins.int
-
-            @property
-            def then(self) -> global___Expression:
-                ...
-
-            def __init__(self, *, then: global___Expression | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['if', b'if', 'then', b'then']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['if', b'if', 'then', b'then']) -> None:
-                ...
-        IFS_FIELD_NUMBER: builtins.int
-        ELSE_FIELD_NUMBER: builtins.int
-
-        @property
-        def ifs(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression.IfThen.IfClause]:
-            ...
-
-        def __init__(self, *, ifs: collections.abc.Iterable[global___Expression.IfThen.IfClause] | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['else', b'else']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['else', b'else', 'ifs', b'ifs']) -> None:
-            ...
-
-    class Cast(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class _FailureBehavior:
-            ValueType = typing.NewType('ValueType', builtins.int)
-            V: typing_extensions.TypeAlias = ValueType
-
-        class _FailureBehaviorEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Expression.Cast._FailureBehavior.ValueType], builtins.type):
-            DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-            FAILURE_BEHAVIOR_UNSPECIFIED: Expression.Cast._FailureBehavior.ValueType
-            FAILURE_BEHAVIOR_RETURN_NULL: Expression.Cast._FailureBehavior.ValueType
-            FAILURE_BEHAVIOR_THROW_EXCEPTION: Expression.Cast._FailureBehavior.ValueType
-
-        class FailureBehavior(_FailureBehavior, metaclass=_FailureBehaviorEnumTypeWrapper):
-            ...
-        FAILURE_BEHAVIOR_UNSPECIFIED: Expression.Cast.FailureBehavior.ValueType
-        FAILURE_BEHAVIOR_RETURN_NULL: Expression.Cast.FailureBehavior.ValueType
-        FAILURE_BEHAVIOR_THROW_EXCEPTION: Expression.Cast.FailureBehavior.ValueType
-        TYPE_FIELD_NUMBER: builtins.int
-        INPUT_FIELD_NUMBER: builtins.int
-        FAILURE_BEHAVIOR_FIELD_NUMBER: builtins.int
-
-        @property
-        def type(self) -> substrait.ibis.type_pb2.Type:
-            ...
-
-        @property
-        def input(self) -> global___Expression:
-            ...
-        failure_behavior: global___Expression.Cast.FailureBehavior.ValueType
-
-        def __init__(self, *, type: substrait.ibis.type_pb2.Type | None=..., input: global___Expression | None=..., failure_behavior: global___Expression.Cast.FailureBehavior.ValueType=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['input', b'input', 'type', b'type']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['failure_behavior', b'failure_behavior', 'input', b'input', 'type', b'type']) -> None:
-            ...
-
-    class SwitchExpression(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class IfValue(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            IF_FIELD_NUMBER: builtins.int
-            THEN_FIELD_NUMBER: builtins.int
-
-            @property
-            def then(self) -> global___Expression:
-                ...
-
-            def __init__(self, *, then: global___Expression | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['if', b'if', 'then', b'then']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['if', b'if', 'then', b'then']) -> None:
-                ...
-        MATCH_FIELD_NUMBER: builtins.int
-        IFS_FIELD_NUMBER: builtins.int
-        ELSE_FIELD_NUMBER: builtins.int
-
-        @property
-        def match(self) -> global___Expression:
-            ...
-
-        @property
-        def ifs(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression.SwitchExpression.IfValue]:
-            ...
-
-        def __init__(self, *, match: global___Expression | None=..., ifs: collections.abc.Iterable[global___Expression.SwitchExpression.IfValue] | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['else', b'else', 'match', b'match']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['else', b'else', 'ifs', b'ifs', 'match', b'match']) -> None:
-            ...
-
-    class SingularOrList(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        VALUE_FIELD_NUMBER: builtins.int
-        OPTIONS_FIELD_NUMBER: builtins.int
-
-        @property
-        def value(self) -> global___Expression:
-            ...
-
-        @property
-        def options(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression]:
-            ...
-
-        def __init__(self, *, value: global___Expression | None=..., options: collections.abc.Iterable[global___Expression] | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['value', b'value']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['options', b'options', 'value', b'value']) -> None:
-            ...
-
-    class MultiOrList(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class Record(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            FIELDS_FIELD_NUMBER: builtins.int
-
-            @property
-            def fields(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression]:
-                ...
-
-            def __init__(self, *, fields: collections.abc.Iterable[global___Expression] | None=...) -> None:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['fields', b'fields']) -> None:
-                ...
-        VALUE_FIELD_NUMBER: builtins.int
-        OPTIONS_FIELD_NUMBER: builtins.int
-
-        @property
-        def value(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression]:
-            ...
-
-        @property
-        def options(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression.MultiOrList.Record]:
-            ...
-
-        def __init__(self, *, value: collections.abc.Iterable[global___Expression] | None=..., options: collections.abc.Iterable[global___Expression.MultiOrList.Record] | None=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['options', b'options', 'value', b'value']) -> None:
-            ...
-
-    class EmbeddedFunction(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class PythonPickleFunction(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            FUNCTION_FIELD_NUMBER: builtins.int
-            PREREQUISITE_FIELD_NUMBER: builtins.int
-            function: builtins.bytes
-
-            @property
-            def prerequisite(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-                ...
-
-            def __init__(self, *, function: builtins.bytes=..., prerequisite: collections.abc.Iterable[builtins.str] | None=...) -> None:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['function', b'function', 'prerequisite', b'prerequisite']) -> None:
-                ...
-
-        class WebAssemblyFunction(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            SCRIPT_FIELD_NUMBER: builtins.int
-            PREREQUISITE_FIELD_NUMBER: builtins.int
-            script: builtins.bytes
-
-            @property
-            def prerequisite(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-                ...
-
-            def __init__(self, *, script: builtins.bytes=..., prerequisite: collections.abc.Iterable[builtins.str] | None=...) -> None:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['prerequisite', b'prerequisite', 'script', b'script']) -> None:
-                ...
-        ARGUMENTS_FIELD_NUMBER: builtins.int
-        OUTPUT_TYPE_FIELD_NUMBER: builtins.int
-        PYTHON_PICKLE_FUNCTION_FIELD_NUMBER: builtins.int
-        WEB_ASSEMBLY_FUNCTION_FIELD_NUMBER: builtins.int
-
-        @property
-        def arguments(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression]:
-            ...
-
-        @property
-        def output_type(self) -> substrait.ibis.type_pb2.Type:
-            ...
-
-        @property
-        def python_pickle_function(self) -> global___Expression.EmbeddedFunction.PythonPickleFunction:
-            ...
-
-        @property
-        def web_assembly_function(self) -> global___Expression.EmbeddedFunction.WebAssemblyFunction:
-            ...
-
-        def __init__(self, *, arguments: collections.abc.Iterable[global___Expression] | None=..., output_type: substrait.ibis.type_pb2.Type | None=..., python_pickle_function: global___Expression.EmbeddedFunction.PythonPickleFunction | None=..., web_assembly_function: global___Expression.EmbeddedFunction.WebAssemblyFunction | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['kind', b'kind', 'output_type', b'output_type', 'python_pickle_function', b'python_pickle_function', 'web_assembly_function', b'web_assembly_function']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['arguments', b'arguments', 'kind', b'kind', 'output_type', b'output_type', 'python_pickle_function', b'python_pickle_function', 'web_assembly_function', b'web_assembly_function']) -> None:
-            ...
-
-        def WhichOneof(self, oneof_group: typing_extensions.Literal['kind', b'kind']) -> typing_extensions.Literal['python_pickle_function', 'web_assembly_function'] | None:
-            ...
-
-    class ReferenceSegment(google.protobuf.message.Message):
-        """A way to reference the inner property of a complex record. Can reference
-        either a map key by literal, a struct field by the ordinal position of
-        the desired field or a particular element in an array. Supports
-        expressions that would roughly translate to something similar to:
-        a.b[2].c['my_map_key'].x where a,b,c and x are struct field references
-        (ordinalized in the internal representation here), [2] is a list offset
-        and ['my_map_key'] is a reference into a map field.
-        """
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class MapKey(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            MAP_KEY_FIELD_NUMBER: builtins.int
-            CHILD_FIELD_NUMBER: builtins.int
-
-            @property
-            def map_key(self) -> global___Expression.Literal:
-                """literal based reference to specific possible value in map."""
-
-            @property
-            def child(self) -> global___Expression.ReferenceSegment:
-                """Optional child segment"""
-
-            def __init__(self, *, map_key: global___Expression.Literal | None=..., child: global___Expression.ReferenceSegment | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['child', b'child', 'map_key', b'map_key']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['child', b'child', 'map_key', b'map_key']) -> None:
-                ...
-
-        class StructField(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            FIELD_FIELD_NUMBER: builtins.int
-            CHILD_FIELD_NUMBER: builtins.int
-            field: builtins.int
-            'zero-indexed ordinal position of field in struct'
-
-            @property
-            def child(self) -> global___Expression.ReferenceSegment:
-                """Optional child segment"""
-
-            def __init__(self, *, field: builtins.int=..., child: global___Expression.ReferenceSegment | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['child', b'child']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['child', b'child', 'field', b'field']) -> None:
-                ...
-
-        class ListElement(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            OFFSET_FIELD_NUMBER: builtins.int
-            CHILD_FIELD_NUMBER: builtins.int
-            offset: builtins.int
-            'zero-indexed ordinal position of element in list'
-
-            @property
-            def child(self) -> global___Expression.ReferenceSegment:
-                """Optional child segment"""
-
-            def __init__(self, *, offset: builtins.int=..., child: global___Expression.ReferenceSegment | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['child', b'child']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['child', b'child', 'offset', b'offset']) -> None:
-                ...
-        MAP_KEY_FIELD_NUMBER: builtins.int
-        STRUCT_FIELD_FIELD_NUMBER: builtins.int
-        LIST_ELEMENT_FIELD_NUMBER: builtins.int
-
-        @property
-        def map_key(self) -> global___Expression.ReferenceSegment.MapKey:
-            ...
-
-        @property
-        def struct_field(self) -> global___Expression.ReferenceSegment.StructField:
-            ...
-
-        @property
-        def list_element(self) -> global___Expression.ReferenceSegment.ListElement:
-            ...
-
-        def __init__(self, *, map_key: global___Expression.ReferenceSegment.MapKey | None=..., struct_field: global___Expression.ReferenceSegment.StructField | None=..., list_element: global___Expression.ReferenceSegment.ListElement | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['list_element', b'list_element', 'map_key', b'map_key', 'reference_type', b'reference_type', 'struct_field', b'struct_field']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['list_element', b'list_element', 'map_key', b'map_key', 'reference_type', b'reference_type', 'struct_field', b'struct_field']) -> None:
-            ...
-
-        def WhichOneof(self, oneof_group: typing_extensions.Literal['reference_type', b'reference_type']) -> typing_extensions.Literal['map_key', 'struct_field', 'list_element'] | None:
-            ...
-
-    class MaskExpression(google.protobuf.message.Message):
-        """A reference that takes an existing subtype and selectively removes fields
-        from it. For example, one might initially have an inner struct with 100
-        fields but a a particular operation only needs to interact with only 2 of
-        those 100 fields. In this situation, one would use a mask expression to
-        eliminate the 98 fields that are not relevant to the rest of the operation
-        pipeline.
-
-        Note that this does not fundamentally alter the structure of data beyond
-        the elimination of unecessary elements.
-        """
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class Select(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            STRUCT_FIELD_NUMBER: builtins.int
-            LIST_FIELD_NUMBER: builtins.int
-            MAP_FIELD_NUMBER: builtins.int
-
-            @property
-            def struct(self) -> global___Expression.MaskExpression.StructSelect:
-                ...
-
-            @property
-            def list(self) -> global___Expression.MaskExpression.ListSelect:
-                ...
-
-            @property
-            def map(self) -> global___Expression.MaskExpression.MapSelect:
-                ...
-
-            def __init__(self, *, struct: global___Expression.MaskExpression.StructSelect | None=..., list: global___Expression.MaskExpression.ListSelect | None=..., map: global___Expression.MaskExpression.MapSelect | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['list', b'list', 'map', b'map', 'struct', b'struct', 'type', b'type']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['list', b'list', 'map', b'map', 'struct', b'struct', 'type', b'type']) -> None:
-                ...
-
-            def WhichOneof(self, oneof_group: typing_extensions.Literal['type', b'type']) -> typing_extensions.Literal['struct', 'list', 'map'] | None:
-                ...
-
-        class StructSelect(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            STRUCT_ITEMS_FIELD_NUMBER: builtins.int
-
-            @property
-            def struct_items(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression.MaskExpression.StructItem]:
-                ...
-
-            def __init__(self, *, struct_items: collections.abc.Iterable[global___Expression.MaskExpression.StructItem] | None=...) -> None:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['struct_items', b'struct_items']) -> None:
-                ...
-
-        class StructItem(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            FIELD_FIELD_NUMBER: builtins.int
-            CHILD_FIELD_NUMBER: builtins.int
-            field: builtins.int
-
-            @property
-            def child(self) -> global___Expression.MaskExpression.Select:
-                ...
-
-            def __init__(self, *, field: builtins.int=..., child: global___Expression.MaskExpression.Select | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['child', b'child']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['child', b'child', 'field', b'field']) -> None:
-                ...
-
-        class ListSelect(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-            class ListSelectItem(google.protobuf.message.Message):
-                DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-                class ListElement(google.protobuf.message.Message):
-                    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-                    FIELD_FIELD_NUMBER: builtins.int
-                    field: builtins.int
-
-                    def __init__(self, *, field: builtins.int=...) -> None:
-                        ...
-
-                    def ClearField(self, field_name: typing_extensions.Literal['field', b'field']) -> None:
-                        ...
-
-                class ListSlice(google.protobuf.message.Message):
-                    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-                    START_FIELD_NUMBER: builtins.int
-                    END_FIELD_NUMBER: builtins.int
-                    start: builtins.int
-                    end: builtins.int
-
-                    def __init__(self, *, start: builtins.int=..., end: builtins.int=...) -> None:
-                        ...
-
-                    def ClearField(self, field_name: typing_extensions.Literal['end', b'end', 'start', b'start']) -> None:
-                        ...
-                ITEM_FIELD_NUMBER: builtins.int
-                SLICE_FIELD_NUMBER: builtins.int
-
-                @property
-                def item(self) -> global___Expression.MaskExpression.ListSelect.ListSelectItem.ListElement:
-                    ...
-
-                @property
-                def slice(self) -> global___Expression.MaskExpression.ListSelect.ListSelectItem.ListSlice:
-                    ...
-
-                def __init__(self, *, item: global___Expression.MaskExpression.ListSelect.ListSelectItem.ListElement | None=..., slice: global___Expression.MaskExpression.ListSelect.ListSelectItem.ListSlice | None=...) -> None:
-                    ...
-
-                def HasField(self, field_name: typing_extensions.Literal['item', b'item', 'slice', b'slice', 'type', b'type']) -> builtins.bool:
-                    ...
-
-                def ClearField(self, field_name: typing_extensions.Literal['item', b'item', 'slice', b'slice', 'type', b'type']) -> None:
-                    ...
-
-                def WhichOneof(self, oneof_group: typing_extensions.Literal['type', b'type']) -> typing_extensions.Literal['item', 'slice'] | None:
-                    ...
-            SELECTION_FIELD_NUMBER: builtins.int
-            CHILD_FIELD_NUMBER: builtins.int
-
-            @property
-            def selection(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression.MaskExpression.ListSelect.ListSelectItem]:
-                ...
-
-            @property
-            def child(self) -> global___Expression.MaskExpression.Select:
-                ...
-
-            def __init__(self, *, selection: collections.abc.Iterable[global___Expression.MaskExpression.ListSelect.ListSelectItem] | None=..., child: global___Expression.MaskExpression.Select | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['child', b'child']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['child', b'child', 'selection', b'selection']) -> None:
-                ...
-
-        class MapSelect(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-            class MapKey(google.protobuf.message.Message):
-                DESCRIPTOR: google.protobuf.descriptor.Descriptor
-                MAP_KEY_FIELD_NUMBER: builtins.int
-                map_key: builtins.str
-
-                def __init__(self, *, map_key: builtins.str=...) -> None:
-                    ...
-
-                def ClearField(self, field_name: typing_extensions.Literal['map_key', b'map_key']) -> None:
-                    ...
-
-            class MapKeyExpression(google.protobuf.message.Message):
-                DESCRIPTOR: google.protobuf.descriptor.Descriptor
-                MAP_KEY_EXPRESSION_FIELD_NUMBER: builtins.int
-                map_key_expression: builtins.str
-
-                def __init__(self, *, map_key_expression: builtins.str=...) -> None:
-                    ...
-
-                def ClearField(self, field_name: typing_extensions.Literal['map_key_expression', b'map_key_expression']) -> None:
-                    ...
-            KEY_FIELD_NUMBER: builtins.int
-            EXPRESSION_FIELD_NUMBER: builtins.int
-            CHILD_FIELD_NUMBER: builtins.int
-
-            @property
-            def key(self) -> global___Expression.MaskExpression.MapSelect.MapKey:
-                ...
-
-            @property
-            def expression(self) -> global___Expression.MaskExpression.MapSelect.MapKeyExpression:
-                ...
-
-            @property
-            def child(self) -> global___Expression.MaskExpression.Select:
-                ...
-
-            def __init__(self, *, key: global___Expression.MaskExpression.MapSelect.MapKey | None=..., expression: global___Expression.MaskExpression.MapSelect.MapKeyExpression | None=..., child: global___Expression.MaskExpression.Select | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['child', b'child', 'expression', b'expression', 'key', b'key', 'select', b'select']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['child', b'child', 'expression', b'expression', 'key', b'key', 'select', b'select']) -> None:
-                ...
-
-            def WhichOneof(self, oneof_group: typing_extensions.Literal['select', b'select']) -> typing_extensions.Literal['key', 'expression'] | None:
-                ...
-        SELECT_FIELD_NUMBER: builtins.int
-        MAINTAIN_SINGULAR_STRUCT_FIELD_NUMBER: builtins.int
-
-        @property
-        def select(self) -> global___Expression.MaskExpression.StructSelect:
-            ...
-        maintain_singular_struct: builtins.bool
-
-        def __init__(self, *, select: global___Expression.MaskExpression.StructSelect | None=..., maintain_singular_struct: builtins.bool=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['select', b'select']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['maintain_singular_struct', b'maintain_singular_struct', 'select', b'select']) -> None:
-            ...
-
-    class FieldReference(google.protobuf.message.Message):
-        """A reference to an inner part of a complex object. Can reference reference a
-        single element or a masked version of elements
-        """
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class RootReference(google.protobuf.message.Message):
-            """Singleton that expresses this FieldReference is rooted off the root
-            incoming record type
-            """
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-            def __init__(self) -> None:
-                ...
-
-        class OuterReference(google.protobuf.message.Message):
-            """A root reference for the outer relation's subquery"""
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            STEPS_OUT_FIELD_NUMBER: builtins.int
-            steps_out: builtins.int
-            "number of subquery boundaries to traverse up for this field's reference\n\n            This value must be >= 1\n            "
-
-            def __init__(self, *, steps_out: builtins.int=...) -> None:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['steps_out', b'steps_out']) -> None:
-                ...
-        DIRECT_REFERENCE_FIELD_NUMBER: builtins.int
-        MASKED_REFERENCE_FIELD_NUMBER: builtins.int
-        EXPRESSION_FIELD_NUMBER: builtins.int
-        ROOT_REFERENCE_FIELD_NUMBER: builtins.int
-        OUTER_REFERENCE_FIELD_NUMBER: builtins.int
-
-        @property
-        def direct_reference(self) -> global___Expression.ReferenceSegment:
-            ...
-
-        @property
-        def masked_reference(self) -> global___Expression.MaskExpression:
-            ...
-
-        @property
-        def expression(self) -> global___Expression:
-            ...
-
-        @property
-        def root_reference(self) -> global___Expression.FieldReference.RootReference:
-            ...
-
-        @property
-        def outer_reference(self) -> global___Expression.FieldReference.OuterReference:
-            ...
-
-        def __init__(self, *, direct_reference: global___Expression.ReferenceSegment | None=..., masked_reference: global___Expression.MaskExpression | None=..., expression: global___Expression | None=..., root_reference: global___Expression.FieldReference.RootReference | None=..., outer_reference: global___Expression.FieldReference.OuterReference | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['direct_reference', b'direct_reference', 'expression', b'expression', 'masked_reference', b'masked_reference', 'outer_reference', b'outer_reference', 'reference_type', b'reference_type', 'root_reference', b'root_reference', 'root_type', b'root_type']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['direct_reference', b'direct_reference', 'expression', b'expression', 'masked_reference', b'masked_reference', 'outer_reference', b'outer_reference', 'reference_type', b'reference_type', 'root_reference', b'root_reference', 'root_type', b'root_type']) -> None:
-            ...
-
-        @typing.overload
-        def WhichOneof(self, oneof_group: typing_extensions.Literal['reference_type', b'reference_type']) -> typing_extensions.Literal['direct_reference', 'masked_reference'] | None:
-            ...
-
-        @typing.overload
-        def WhichOneof(self, oneof_group: typing_extensions.Literal['root_type', b'root_type']) -> typing_extensions.Literal['expression', 'root_reference', 'outer_reference'] | None:
-            ...
-
-    class Subquery(google.protobuf.message.Message):
-        """Subquery relation expression"""
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class Scalar(google.protobuf.message.Message):
-            """A subquery with one row and one column. This is often an aggregate
-            though not required to be.
-            """
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            INPUT_FIELD_NUMBER: builtins.int
-
-            @property
-            def input(self) -> global___Rel:
-                ...
-
-            def __init__(self, *, input: global___Rel | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['input', b'input']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['input', b'input']) -> None:
-                ...
-
-        class InPredicate(google.protobuf.message.Message):
-            """Predicate checking that the left expression is contained in the right
-            subquery
-
-            Examples:
-
-            x IN (SELECT * FROM t)
-            (x, y) IN (SELECT a, b FROM t)
-            """
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            NEEDLES_FIELD_NUMBER: builtins.int
-            HAYSTACK_FIELD_NUMBER: builtins.int
-
-            @property
-            def needles(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression]:
-                ...
-
-            @property
-            def haystack(self) -> global___Rel:
-                ...
-
-            def __init__(self, *, needles: collections.abc.Iterable[global___Expression] | None=..., haystack: global___Rel | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['haystack', b'haystack']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['haystack', b'haystack', 'needles', b'needles']) -> None:
-                ...
-
-        class SetPredicate(google.protobuf.message.Message):
-            """A predicate over a set of rows in the form of a subquery
-            EXISTS and UNIQUE are common SQL forms of this operation.
-            """
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-            class _PredicateOp:
-                ValueType = typing.NewType('ValueType', builtins.int)
-                V: typing_extensions.TypeAlias = ValueType
-
-            class _PredicateOpEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Expression.Subquery.SetPredicate._PredicateOp.ValueType], builtins.type):
-                DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-                PREDICATE_OP_UNSPECIFIED: Expression.Subquery.SetPredicate._PredicateOp.ValueType
-                PREDICATE_OP_EXISTS: Expression.Subquery.SetPredicate._PredicateOp.ValueType
-                PREDICATE_OP_UNIQUE: Expression.Subquery.SetPredicate._PredicateOp.ValueType
-
-            class PredicateOp(_PredicateOp, metaclass=_PredicateOpEnumTypeWrapper):
-                ...
-            PREDICATE_OP_UNSPECIFIED: Expression.Subquery.SetPredicate.PredicateOp.ValueType
-            PREDICATE_OP_EXISTS: Expression.Subquery.SetPredicate.PredicateOp.ValueType
-            PREDICATE_OP_UNIQUE: Expression.Subquery.SetPredicate.PredicateOp.ValueType
-            PREDICATE_OP_FIELD_NUMBER: builtins.int
-            TUPLES_FIELD_NUMBER: builtins.int
-            predicate_op: global___Expression.Subquery.SetPredicate.PredicateOp.ValueType
-            'TODO: should allow expressions'
-
-            @property
-            def tuples(self) -> global___Rel:
-                ...
-
-            def __init__(self, *, predicate_op: global___Expression.Subquery.SetPredicate.PredicateOp.ValueType=..., tuples: global___Rel | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['tuples', b'tuples']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['predicate_op', b'predicate_op', 'tuples', b'tuples']) -> None:
-                ...
-
-        class SetComparison(google.protobuf.message.Message):
-            """A subquery comparison using ANY or ALL.
-            Examples:
-
-            SELECT *
-            FROM t1
-            WHERE x < ANY(SELECT y from t2)
-            """
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-            class _ComparisonOp:
-                ValueType = typing.NewType('ValueType', builtins.int)
-                V: typing_extensions.TypeAlias = ValueType
-
-            class _ComparisonOpEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Expression.Subquery.SetComparison._ComparisonOp.ValueType], builtins.type):
-                DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-                COMPARISON_OP_UNSPECIFIED: Expression.Subquery.SetComparison._ComparisonOp.ValueType
-                COMPARISON_OP_EQ: Expression.Subquery.SetComparison._ComparisonOp.ValueType
-                COMPARISON_OP_NE: Expression.Subquery.SetComparison._ComparisonOp.ValueType
-                COMPARISON_OP_LT: Expression.Subquery.SetComparison._ComparisonOp.ValueType
-                COMPARISON_OP_GT: Expression.Subquery.SetComparison._ComparisonOp.ValueType
-                COMPARISON_OP_LE: Expression.Subquery.SetComparison._ComparisonOp.ValueType
-                COMPARISON_OP_GE: Expression.Subquery.SetComparison._ComparisonOp.ValueType
-
-            class ComparisonOp(_ComparisonOp, metaclass=_ComparisonOpEnumTypeWrapper):
-                ...
-            COMPARISON_OP_UNSPECIFIED: Expression.Subquery.SetComparison.ComparisonOp.ValueType
-            COMPARISON_OP_EQ: Expression.Subquery.SetComparison.ComparisonOp.ValueType
-            COMPARISON_OP_NE: Expression.Subquery.SetComparison.ComparisonOp.ValueType
-            COMPARISON_OP_LT: Expression.Subquery.SetComparison.ComparisonOp.ValueType
-            COMPARISON_OP_GT: Expression.Subquery.SetComparison.ComparisonOp.ValueType
-            COMPARISON_OP_LE: Expression.Subquery.SetComparison.ComparisonOp.ValueType
-            COMPARISON_OP_GE: Expression.Subquery.SetComparison.ComparisonOp.ValueType
-
-            class _ReductionOp:
-                ValueType = typing.NewType('ValueType', builtins.int)
-                V: typing_extensions.TypeAlias = ValueType
-
-            class _ReductionOpEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Expression.Subquery.SetComparison._ReductionOp.ValueType], builtins.type):
-                DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-                REDUCTION_OP_UNSPECIFIED: Expression.Subquery.SetComparison._ReductionOp.ValueType
-                REDUCTION_OP_ANY: Expression.Subquery.SetComparison._ReductionOp.ValueType
-                REDUCTION_OP_ALL: Expression.Subquery.SetComparison._ReductionOp.ValueType
-
-            class ReductionOp(_ReductionOp, metaclass=_ReductionOpEnumTypeWrapper):
-                ...
-            REDUCTION_OP_UNSPECIFIED: Expression.Subquery.SetComparison.ReductionOp.ValueType
-            REDUCTION_OP_ANY: Expression.Subquery.SetComparison.ReductionOp.ValueType
-            REDUCTION_OP_ALL: Expression.Subquery.SetComparison.ReductionOp.ValueType
-            REDUCTION_OP_FIELD_NUMBER: builtins.int
-            COMPARISON_OP_FIELD_NUMBER: builtins.int
-            LEFT_FIELD_NUMBER: builtins.int
-            RIGHT_FIELD_NUMBER: builtins.int
-            reduction_op: global___Expression.Subquery.SetComparison.ReductionOp.ValueType
-            'ANY or ALL'
-            comparison_op: global___Expression.Subquery.SetComparison.ComparisonOp.ValueType
-            'A comparison operator'
-
-            @property
-            def left(self) -> global___Expression:
-                """left side of the expression"""
-
-            @property
-            def right(self) -> global___Rel:
-                """right side of the expression"""
-
-            def __init__(self, *, reduction_op: global___Expression.Subquery.SetComparison.ReductionOp.ValueType=..., comparison_op: global___Expression.Subquery.SetComparison.ComparisonOp.ValueType=..., left: global___Expression | None=..., right: global___Rel | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['left', b'left', 'right', b'right']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['comparison_op', b'comparison_op', 'left', b'left', 'reduction_op', b'reduction_op', 'right', b'right']) -> None:
-                ...
-        SCALAR_FIELD_NUMBER: builtins.int
-        IN_PREDICATE_FIELD_NUMBER: builtins.int
-        SET_PREDICATE_FIELD_NUMBER: builtins.int
-        SET_COMPARISON_FIELD_NUMBER: builtins.int
-
-        @property
-        def scalar(self) -> global___Expression.Subquery.Scalar:
-            """Scalar subquery"""
-
-        @property
-        def in_predicate(self) -> global___Expression.Subquery.InPredicate:
-            """x IN y predicate"""
-
-        @property
-        def set_predicate(self) -> global___Expression.Subquery.SetPredicate:
-            """EXISTS/UNIQUE predicate"""
-
-        @property
-        def set_comparison(self) -> global___Expression.Subquery.SetComparison:
-            """ANY/ALL predicate"""
-
-        def __init__(self, *, scalar: global___Expression.Subquery.Scalar | None=..., in_predicate: global___Expression.Subquery.InPredicate | None=..., set_predicate: global___Expression.Subquery.SetPredicate | None=..., set_comparison: global___Expression.Subquery.SetComparison | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['in_predicate', b'in_predicate', 'scalar', b'scalar', 'set_comparison', b'set_comparison', 'set_predicate', b'set_predicate', 'subquery_type', b'subquery_type']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['in_predicate', b'in_predicate', 'scalar', b'scalar', 'set_comparison', b'set_comparison', 'set_predicate', b'set_predicate', 'subquery_type', b'subquery_type']) -> None:
-            ...
-
-        def WhichOneof(self, oneof_group: typing_extensions.Literal['subquery_type', b'subquery_type']) -> typing_extensions.Literal['scalar', 'in_predicate', 'set_predicate', 'set_comparison'] | None:
-            ...
-    LITERAL_FIELD_NUMBER: builtins.int
-    SELECTION_FIELD_NUMBER: builtins.int
-    SCALAR_FUNCTION_FIELD_NUMBER: builtins.int
-    WINDOW_FUNCTION_FIELD_NUMBER: builtins.int
-    IF_THEN_FIELD_NUMBER: builtins.int
-    SWITCH_EXPRESSION_FIELD_NUMBER: builtins.int
-    SINGULAR_OR_LIST_FIELD_NUMBER: builtins.int
-    MULTI_OR_LIST_FIELD_NUMBER: builtins.int
-    CAST_FIELD_NUMBER: builtins.int
-    SUBQUERY_FIELD_NUMBER: builtins.int
-    NESTED_FIELD_NUMBER: builtins.int
-    ENUM_FIELD_NUMBER: builtins.int
-
-    @property
-    def literal(self) -> global___Expression.Literal:
-        ...
-
-    @property
-    def selection(self) -> global___Expression.FieldReference:
-        ...
-
-    @property
-    def scalar_function(self) -> global___Expression.ScalarFunction:
-        ...
-
-    @property
-    def window_function(self) -> global___Expression.WindowFunction:
-        ...
-
-    @property
-    def if_then(self) -> global___Expression.IfThen:
-        ...
-
-    @property
-    def switch_expression(self) -> global___Expression.SwitchExpression:
-        ...
-
-    @property
-    def singular_or_list(self) -> global___Expression.SingularOrList:
-        ...
-
-    @property
-    def multi_or_list(self) -> global___Expression.MultiOrList:
-        ...
-
-    @property
-    def cast(self) -> global___Expression.Cast:
-        ...
-
-    @property
-    def subquery(self) -> global___Expression.Subquery:
-        ...
-
-    @property
-    def nested(self) -> global___Expression.Nested:
-        ...
-
-    @property
-    def enum(self) -> global___Expression.Enum:
-        """deprecated: enum literals are only sensible in the context of
-        function arguments, for which FunctionArgument should now be
-        used
-        """
-
-    def __init__(self, *, literal: global___Expression.Literal | None=..., selection: global___Expression.FieldReference | None=..., scalar_function: global___Expression.ScalarFunction | None=..., window_function: global___Expression.WindowFunction | None=..., if_then: global___Expression.IfThen | None=..., switch_expression: global___Expression.SwitchExpression | None=..., singular_or_list: global___Expression.SingularOrList | None=..., multi_or_list: global___Expression.MultiOrList | None=..., cast: global___Expression.Cast | None=..., subquery: global___Expression.Subquery | None=..., nested: global___Expression.Nested | None=..., enum: global___Expression.Enum | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['cast', b'cast', 'enum', b'enum', 'if_then', b'if_then', 'literal', b'literal', 'multi_or_list', b'multi_or_list', 'nested', b'nested', 'rex_type', b'rex_type', 'scalar_function', b'scalar_function', 'selection', b'selection', 'singular_or_list', b'singular_or_list', 'subquery', b'subquery', 'switch_expression', b'switch_expression', 'window_function', b'window_function']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['cast', b'cast', 'enum', b'enum', 'if_then', b'if_then', 'literal', b'literal', 'multi_or_list', b'multi_or_list', 'nested', b'nested', 'rex_type', b'rex_type', 'scalar_function', b'scalar_function', 'selection', b'selection', 'singular_or_list', b'singular_or_list', 'subquery', b'subquery', 'switch_expression', b'switch_expression', 'window_function', b'window_function']) -> None:
-        ...
-
-    def WhichOneof(self, oneof_group: typing_extensions.Literal['rex_type', b'rex_type']) -> typing_extensions.Literal['literal', 'selection', 'scalar_function', 'window_function', 'if_then', 'switch_expression', 'singular_or_list', 'multi_or_list', 'cast', 'subquery', 'nested', 'enum'] | None:
-        ...
-global___Expression = Expression
-
-class SortField(google.protobuf.message.Message):
-    """The description of a field to sort on (including the direction of sorting and null semantics)"""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class _SortDirection:
-        ValueType = typing.NewType('ValueType', builtins.int)
-        V: typing_extensions.TypeAlias = ValueType
-
-    class _SortDirectionEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[SortField._SortDirection.ValueType], builtins.type):
-        DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-        SORT_DIRECTION_UNSPECIFIED: SortField._SortDirection.ValueType
-        SORT_DIRECTION_ASC_NULLS_FIRST: SortField._SortDirection.ValueType
-        SORT_DIRECTION_ASC_NULLS_LAST: SortField._SortDirection.ValueType
-        SORT_DIRECTION_DESC_NULLS_FIRST: SortField._SortDirection.ValueType
-        SORT_DIRECTION_DESC_NULLS_LAST: SortField._SortDirection.ValueType
-        SORT_DIRECTION_CLUSTERED: SortField._SortDirection.ValueType
-
-    class SortDirection(_SortDirection, metaclass=_SortDirectionEnumTypeWrapper):
-        ...
-    SORT_DIRECTION_UNSPECIFIED: SortField.SortDirection.ValueType
-    SORT_DIRECTION_ASC_NULLS_FIRST: SortField.SortDirection.ValueType
-    SORT_DIRECTION_ASC_NULLS_LAST: SortField.SortDirection.ValueType
-    SORT_DIRECTION_DESC_NULLS_FIRST: SortField.SortDirection.ValueType
-    SORT_DIRECTION_DESC_NULLS_LAST: SortField.SortDirection.ValueType
-    SORT_DIRECTION_CLUSTERED: SortField.SortDirection.ValueType
-    EXPR_FIELD_NUMBER: builtins.int
-    DIRECTION_FIELD_NUMBER: builtins.int
-    COMPARISON_FUNCTION_REFERENCE_FIELD_NUMBER: builtins.int
-
-    @property
-    def expr(self) -> global___Expression:
-        ...
-    direction: global___SortField.SortDirection.ValueType
-    comparison_function_reference: builtins.int
-
-    def __init__(self, *, expr: global___Expression | None=..., direction: global___SortField.SortDirection.ValueType=..., comparison_function_reference: builtins.int=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['comparison_function_reference', b'comparison_function_reference', 'direction', b'direction', 'expr', b'expr', 'sort_kind', b'sort_kind']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['comparison_function_reference', b'comparison_function_reference', 'direction', b'direction', 'expr', b'expr', 'sort_kind', b'sort_kind']) -> None:
-        ...
-
-    def WhichOneof(self, oneof_group: typing_extensions.Literal['sort_kind', b'sort_kind']) -> typing_extensions.Literal['direction', 'comparison_function_reference'] | None:
-        ...
-global___SortField = SortField
-
-class AggregateFunction(google.protobuf.message.Message):
-    """An aggregate function."""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class _AggregationInvocation:
-        ValueType = typing.NewType('ValueType', builtins.int)
-        V: typing_extensions.TypeAlias = ValueType
-
-    class _AggregationInvocationEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[AggregateFunction._AggregationInvocation.ValueType], builtins.type):
-        DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-        AGGREGATION_INVOCATION_UNSPECIFIED: AggregateFunction._AggregationInvocation.ValueType
-        'This default value implies AGGREGATION_INVOCATION_ALL.'
-        AGGREGATION_INVOCATION_ALL: AggregateFunction._AggregationInvocation.ValueType
-        'Use all values in the aggregation calculation.'
-        AGGREGATION_INVOCATION_DISTINCT: AggregateFunction._AggregationInvocation.ValueType
-        'Use only distinct values in the aggregation calculation.'
-
-    class AggregationInvocation(_AggregationInvocation, metaclass=_AggregationInvocationEnumTypeWrapper):
-        """Method in which equivalent records are merged before being aggregated."""
-    AGGREGATION_INVOCATION_UNSPECIFIED: AggregateFunction.AggregationInvocation.ValueType
-    'This default value implies AGGREGATION_INVOCATION_ALL.'
-    AGGREGATION_INVOCATION_ALL: AggregateFunction.AggregationInvocation.ValueType
-    'Use all values in the aggregation calculation.'
-    AGGREGATION_INVOCATION_DISTINCT: AggregateFunction.AggregationInvocation.ValueType
-    'Use only distinct values in the aggregation calculation.'
-
-    class ReferenceRel(google.protobuf.message.Message):
-        """This rel is used  to create references,
-        in case we refer to a RelRoot field names will be ignored
-        """
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        SUBTREE_ORDINAL_FIELD_NUMBER: builtins.int
-        subtree_ordinal: builtins.int
-
-        def __init__(self, *, subtree_ordinal: builtins.int=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['subtree_ordinal', b'subtree_ordinal']) -> None:
-            ...
-    FUNCTION_REFERENCE_FIELD_NUMBER: builtins.int
-    ARGUMENTS_FIELD_NUMBER: builtins.int
-    OPTIONS_FIELD_NUMBER: builtins.int
-    OUTPUT_TYPE_FIELD_NUMBER: builtins.int
-    PHASE_FIELD_NUMBER: builtins.int
-    SORTS_FIELD_NUMBER: builtins.int
-    INVOCATION_FIELD_NUMBER: builtins.int
-    ARGS_FIELD_NUMBER: builtins.int
-    function_reference: builtins.int
-    'Points to a function_anchor defined in this plan, which must refer\n    to an aggregate function in the associated YAML file. Required; 0 is\n    considered to be a valid anchor/reference.\n    '
-
-    @property
-    def arguments(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FunctionArgument]:
-        """The arguments to be bound to the function. This must have exactly the
-        number of arguments specified in the function definition, and the
-        argument types must also match exactly:
-
-         - Value arguments must be bound using FunctionArgument.value, and
-           the expression in that must yield a value of a type that a function
-           overload is defined for.
-         - Type arguments must be bound using FunctionArgument.type, and a
-           function overload must be defined for that type.
-         - Enum arguments must be bound using FunctionArgument.enum
-           followed by Enum.specified, with a string that case-insensitively
-           matches one of the allowed options.
-         - Optional enum arguments must be bound using FunctionArgument.enum
-           followed by either Enum.specified or Enum.unspecified. If specified,
-           the string must case-insensitively match one of the allowed options.
-        """
-
-    @property
-    def options(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FunctionOption]:
-        """Options to specify behavior for corner cases, or leave behavior
-        unspecified if the consumer does not need specific behavior in these
-        cases.
-        """
-
-    @property
-    def output_type(self) -> substrait.ibis.type_pb2.Type:
-        """Must be set to the return type of the function, exactly as derived
-        using the declaration in the extension.
-        """
-    phase: global___AggregationPhase.ValueType
-    'Describes which part of the aggregation to perform within the context of\n    distributed algorithms. Required. Must be set to INITIAL_TO_RESULT for\n    aggregate functions that are not decomposable.\n    '
-
-    @property
-    def sorts(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___SortField]:
-        """If specified, the aggregated records are ordered according to this list
-        before they are aggregated. The first sort field has the highest
-        priority; only if a sort field determines two records to be equivalent is
-        the next field queried. This field is optional.
-        """
-    invocation: global___AggregateFunction.AggregationInvocation.ValueType
-    'Specifies whether equivalent records are merged before being aggregated.\n    Optional, defaults to AGGREGATION_INVOCATION_ALL.\n    '
-
-    @property
-    def args(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Expression]:
-        """deprecated; use arguments instead"""
-
-    def __init__(self, *, function_reference: builtins.int=..., arguments: collections.abc.Iterable[global___FunctionArgument] | None=..., options: collections.abc.Iterable[global___FunctionOption] | None=..., output_type: substrait.ibis.type_pb2.Type | None=..., phase: global___AggregationPhase.ValueType=..., sorts: collections.abc.Iterable[global___SortField] | None=..., invocation: global___AggregateFunction.AggregationInvocation.ValueType=..., args: collections.abc.Iterable[global___Expression] | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['output_type', b'output_type']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['args', b'args', 'arguments', b'arguments', 'function_reference', b'function_reference', 'invocation', b'invocation', 'options', b'options', 'output_type', b'output_type', 'phase', b'phase', 'sorts', b'sorts']) -> None:
-        ...
-global___AggregateFunction = AggregateFunction
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/ibis/capabilities_pb2.py b/ibis_substrait/proto/substrait/ibis/capabilities_pb2.py
deleted file mode 100644
index 8e6278ab..00000000
--- a/ibis_substrait/proto/substrait/ibis/capabilities_pb2.py
+++ /dev/null
@@ -1,16 +0,0 @@
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-_sym_db = _symbol_database.Default()
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!substrait/ibis/capabilities.proto\x12\x0esubstrait.ibis"\xf1\x02\n\x0cCapabilities\x12-\n\x12substrait_versions\x18\x01 \x03(\tR\x11substraitVersions\x12?\n\x1cadvanced_extension_type_urls\x18\x02 \x03(\tR\x19advancedExtensionTypeUrls\x12Y\n\x11simple_extensions\x18\x03 \x03(\x0b2,.substrait.ibis.Capabilities.SimpleExtensionR\x10simpleExtensions\x1a\x95\x01\n\x0fSimpleExtension\x12\x10\n\x03uri\x18\x01 \x01(\tR\x03uri\x12#\n\rfunction_keys\x18\x02 \x03(\tR\x0cfunctionKeys\x12\x1b\n\ttype_keys\x18\x03 \x03(\tR\x08typeKeys\x12.\n\x13type_variation_keys\x18\x04 \x03(\tR\x11typeVariationKeysB5\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobufb\x06proto3')
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'substrait.ibis.capabilities_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-    DESCRIPTOR._options = None
-    DESCRIPTOR._serialized_options = b'\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobuf'
-    _CAPABILITIES._serialized_start = 54
-    _CAPABILITIES._serialized_end = 423
-    _CAPABILITIES_SIMPLEEXTENSION._serialized_start = 274
-    _CAPABILITIES_SIMPLEEXTENSION._serialized_end = 423
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/ibis/capabilities_pb2.pyi b/ibis_substrait/proto/substrait/ibis/capabilities_pb2.pyi
deleted file mode 100644
index 288aa825..00000000
--- a/ibis_substrait/proto/substrait/ibis/capabilities_pb2.pyi
+++ /dev/null
@@ -1,69 +0,0 @@
-"""
-@generated by mypy-protobuf.  Do not edit manually!
-isort:skip_file
-SPDX-License-Identifier: Apache-2.0"""
-import builtins
-import collections.abc
-import google.protobuf.descriptor
-import google.protobuf.internal.containers
-import google.protobuf.message
-import sys
-if sys.version_info >= (3, 8):
-    import typing as typing_extensions
-else:
-    import typing_extensions
-DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
-
-class Capabilities(google.protobuf.message.Message):
-    """Defines a set of Capabilities that a system (producer or consumer) supports."""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class SimpleExtension(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        URI_FIELD_NUMBER: builtins.int
-        FUNCTION_KEYS_FIELD_NUMBER: builtins.int
-        TYPE_KEYS_FIELD_NUMBER: builtins.int
-        TYPE_VARIATION_KEYS_FIELD_NUMBER: builtins.int
-        uri: builtins.str
-
-        @property
-        def function_keys(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-            ...
-
-        @property
-        def type_keys(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-            ...
-
-        @property
-        def type_variation_keys(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-            ...
-
-        def __init__(self, *, uri: builtins.str=..., function_keys: collections.abc.Iterable[builtins.str] | None=..., type_keys: collections.abc.Iterable[builtins.str] | None=..., type_variation_keys: collections.abc.Iterable[builtins.str] | None=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['function_keys', b'function_keys', 'type_keys', b'type_keys', 'type_variation_keys', b'type_variation_keys', 'uri', b'uri']) -> None:
-            ...
-    SUBSTRAIT_VERSIONS_FIELD_NUMBER: builtins.int
-    ADVANCED_EXTENSION_TYPE_URLS_FIELD_NUMBER: builtins.int
-    SIMPLE_EXTENSIONS_FIELD_NUMBER: builtins.int
-
-    @property
-    def substrait_versions(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-        """List of Substrait versions this system supports"""
-
-    @property
-    def advanced_extension_type_urls(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-        """list of com.google.Any message types this system supports for advanced
-        extensions.
-        """
-
-    @property
-    def simple_extensions(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Capabilities.SimpleExtension]:
-        """list of simple extensions this system supports."""
-
-    def __init__(self, *, substrait_versions: collections.abc.Iterable[builtins.str] | None=..., advanced_extension_type_urls: collections.abc.Iterable[builtins.str] | None=..., simple_extensions: collections.abc.Iterable[global___Capabilities.SimpleExtension] | None=...) -> None:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['advanced_extension_type_urls', b'advanced_extension_type_urls', 'simple_extensions', b'simple_extensions', 'substrait_versions', b'substrait_versions']) -> None:
-        ...
-global___Capabilities = Capabilities
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/ibis/extended_expression_pb2.py b/ibis_substrait/proto/substrait/ibis/extended_expression_pb2.py
deleted file mode 100644
index bb756171..00000000
--- a/ibis_substrait/proto/substrait/ibis/extended_expression_pb2.py
+++ /dev/null
@@ -1,20 +0,0 @@
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-_sym_db = _symbol_database.Default()
-from ...substrait.ibis import algebra_pb2 as substrait_dot_ibis_dot_algebra__pb2
-from ...substrait.ibis.extensions import extensions_pb2 as substrait_dot_ibis_dot_extensions_dot_extensions__pb2
-from ...substrait.ibis import plan_pb2 as substrait_dot_ibis_dot_plan__pb2
-from ...substrait.ibis import type_pb2 as substrait_dot_ibis_dot_type__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(substrait/ibis/extended_expression.proto\x12\x0esubstrait.ibis\x1a\x1csubstrait/ibis/algebra.proto\x1a*substrait/ibis/extensions/extensions.proto\x1a\x19substrait/ibis/plan.proto\x1a\x19substrait/ibis/type.proto"\xc2\x01\n\x13ExpressionReference\x12<\n\nexpression\x18\x01 \x01(\x0b2\x1a.substrait.ibis.ExpressionH\x00R\nexpression\x12=\n\x07measure\x18\x02 \x01(\x0b2!.substrait.ibis.AggregateFunctionH\x00R\x07measure\x12!\n\x0coutput_names\x18\x03 \x03(\tR\x0boutputNamesB\x0b\n\texpr_type"\x89\x04\n\x12ExtendedExpression\x121\n\x07version\x18\x07 \x01(\x0b2\x17.substrait.ibis.VersionR\x07version\x12T\n\x0eextension_uris\x18\x01 \x03(\x0b2-.substrait.ibis.extensions.SimpleExtensionURIR\rextensionUris\x12U\n\nextensions\x18\x02 \x03(\x0b25.substrait.ibis.extensions.SimpleExtensionDeclarationR\nextensions\x12H\n\rreferred_expr\x18\x03 \x03(\x0b2#.substrait.ibis.ExpressionReferenceR\x0creferredExpr\x12<\n\x0bbase_schema\x18\x04 \x01(\x0b2\x1b.substrait.ibis.NamedStructR\nbaseSchema\x12]\n\x13advanced_extensions\x18\x05 \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x12advancedExtensions\x12,\n\x12expected_type_urls\x18\x06 \x03(\tR\x10expectedTypeUrlsB5\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobufb\x06proto3')
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'substrait.ibis.extended_expression_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-    DESCRIPTOR._options = None
-    DESCRIPTOR._serialized_options = b'\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobuf'
-    _EXPRESSIONREFERENCE._serialized_start = 189
-    _EXPRESSIONREFERENCE._serialized_end = 383
-    _EXTENDEDEXPRESSION._serialized_start = 386
-    _EXTENDEDEXPRESSION._serialized_end = 907
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/ibis/extended_expression_pb2.pyi b/ibis_substrait/proto/substrait/ibis/extended_expression_pb2.pyi
deleted file mode 100644
index 6a1beb9b..00000000
--- a/ibis_substrait/proto/substrait/ibis/extended_expression_pb2.pyi
+++ /dev/null
@@ -1,105 +0,0 @@
-"""
-@generated by mypy-protobuf.  Do not edit manually!
-isort:skip_file
-SPDX-License-Identifier: Apache-2.0"""
-import builtins
-import collections.abc
-import google.protobuf.descriptor
-import google.protobuf.internal.containers
-import google.protobuf.message
-from ... import substrait
-import sys
-if sys.version_info >= (3, 8):
-    import typing as typing_extensions
-else:
-    import typing_extensions
-DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
-
-class ExpressionReference(google.protobuf.message.Message):
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    EXPRESSION_FIELD_NUMBER: builtins.int
-    MEASURE_FIELD_NUMBER: builtins.int
-    OUTPUT_NAMES_FIELD_NUMBER: builtins.int
-
-    @property
-    def expression(self) -> substrait.ibis.algebra_pb2.Expression:
-        ...
-
-    @property
-    def measure(self) -> substrait.ibis.algebra_pb2.AggregateFunction:
-        ...
-
-    @property
-    def output_names(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-        """Field names in depth-first order"""
-
-    def __init__(self, *, expression: substrait.ibis.algebra_pb2.Expression | None=..., measure: substrait.ibis.algebra_pb2.AggregateFunction | None=..., output_names: collections.abc.Iterable[builtins.str] | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['expr_type', b'expr_type', 'expression', b'expression', 'measure', b'measure']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['expr_type', b'expr_type', 'expression', b'expression', 'measure', b'measure', 'output_names', b'output_names']) -> None:
-        ...
-
-    def WhichOneof(self, oneof_group: typing_extensions.Literal['expr_type', b'expr_type']) -> typing_extensions.Literal['expression', 'measure'] | None:
-        ...
-global___ExpressionReference = ExpressionReference
-
-class ExtendedExpression(google.protobuf.message.Message):
-    """Describe a set of operations to complete.
-    For compactness sake, identifiers are normalized at the plan level.
-    """
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    VERSION_FIELD_NUMBER: builtins.int
-    EXTENSION_URIS_FIELD_NUMBER: builtins.int
-    EXTENSIONS_FIELD_NUMBER: builtins.int
-    REFERRED_EXPR_FIELD_NUMBER: builtins.int
-    BASE_SCHEMA_FIELD_NUMBER: builtins.int
-    ADVANCED_EXTENSIONS_FIELD_NUMBER: builtins.int
-    EXPECTED_TYPE_URLS_FIELD_NUMBER: builtins.int
-
-    @property
-    def version(self) -> substrait.ibis.plan_pb2.Version:
-        """Substrait version of the expression. Optional up to 0.17.0, required for later
-        versions.
-        """
-
-    @property
-    def extension_uris(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[substrait.ibis.extensions.extensions_pb2.SimpleExtensionURI]:
-        """a list of yaml specifications this expression may depend on"""
-
-    @property
-    def extensions(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[substrait.ibis.extensions.extensions_pb2.SimpleExtensionDeclaration]:
-        """a list of extensions this expression may depend on"""
-
-    @property
-    def referred_expr(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ExpressionReference]:
-        """one or more expression trees with same order in plan rel"""
-
-    @property
-    def base_schema(self) -> substrait.ibis.type_pb2.NamedStruct:
-        ...
-
-    @property
-    def advanced_extensions(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-        """additional extensions associated with this expression."""
-
-    @property
-    def expected_type_urls(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-        """A list of com.google.Any entities that this plan may use. Can be used to
-        warn if some embedded message types are unknown. Note that this list may
-        include message types that are ignorable (optimizations) or that are
-        unused. In many cases, a consumer may be able to work with a plan even if
-        one or more message types defined here are unknown.
-        """
-
-    def __init__(self, *, version: substrait.ibis.plan_pb2.Version | None=..., extension_uris: collections.abc.Iterable[substrait.ibis.extensions.extensions_pb2.SimpleExtensionURI] | None=..., extensions: collections.abc.Iterable[substrait.ibis.extensions.extensions_pb2.SimpleExtensionDeclaration] | None=..., referred_expr: collections.abc.Iterable[global___ExpressionReference] | None=..., base_schema: substrait.ibis.type_pb2.NamedStruct | None=..., advanced_extensions: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=..., expected_type_urls: collections.abc.Iterable[builtins.str] | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['advanced_extensions', b'advanced_extensions', 'base_schema', b'base_schema', 'version', b'version']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['advanced_extensions', b'advanced_extensions', 'base_schema', b'base_schema', 'expected_type_urls', b'expected_type_urls', 'extension_uris', b'extension_uris', 'extensions', b'extensions', 'referred_expr', b'referred_expr', 'version', b'version']) -> None:
-        ...
-global___ExtendedExpression = ExtendedExpression
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/ibis/extensions/__init__.py b/ibis_substrait/proto/substrait/ibis/extensions/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/ibis_substrait/proto/substrait/ibis/extensions/__init__.pyi b/ibis_substrait/proto/substrait/ibis/extensions/__init__.pyi
deleted file mode 100644
index 296a60a4..00000000
--- a/ibis_substrait/proto/substrait/ibis/extensions/__init__.pyi
+++ /dev/null
@@ -1,1 +0,0 @@
-from . import extensions_pb2
diff --git a/ibis_substrait/proto/substrait/ibis/extensions/extensions_pb2.py b/ibis_substrait/proto/substrait/ibis/extensions/extensions_pb2.py
deleted file mode 100644
index 02b452c1..00000000
--- a/ibis_substrait/proto/substrait/ibis/extensions/extensions_pb2.py
+++ /dev/null
@@ -1,25 +0,0 @@
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-_sym_db = _symbol_database.Default()
-from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n*substrait/ibis/extensions/extensions.proto\x12\x19substrait.ibis.extensions\x1a\x19google/protobuf/any.proto"X\n\x12SimpleExtensionURI\x120\n\x14extension_uri_anchor\x18\x01 \x01(\rR\x12extensionUriAnchor\x12\x10\n\x03uri\x18\x02 \x01(\tR\x03uri"\xc3\x06\n\x1aSimpleExtensionDeclaration\x12l\n\x0eextension_type\x18\x01 \x01(\x0b2C.substrait.ibis.extensions.SimpleExtensionDeclaration.ExtensionTypeH\x00R\rextensionType\x12\x88\x01\n\x18extension_type_variation\x18\x02 \x01(\x0b2L.substrait.ibis.extensions.SimpleExtensionDeclaration.ExtensionTypeVariationH\x00R\x16extensionTypeVariation\x12x\n\x12extension_function\x18\x03 \x01(\x0b2G.substrait.ibis.extensions.SimpleExtensionDeclaration.ExtensionFunctionH\x00R\x11extensionFunction\x1a|\n\rExtensionType\x126\n\x17extension_uri_reference\x18\x01 \x01(\rR\x15extensionUriReference\x12\x1f\n\x0btype_anchor\x18\x02 \x01(\rR\ntypeAnchor\x12\x12\n\x04name\x18\x03 \x01(\tR\x04name\x1a\x98\x01\n\x16ExtensionTypeVariation\x126\n\x17extension_uri_reference\x18\x01 \x01(\rR\x15extensionUriReference\x122\n\x15type_variation_anchor\x18\x02 \x01(\rR\x13typeVariationAnchor\x12\x12\n\x04name\x18\x03 \x01(\tR\x04name\x1a\x88\x01\n\x11ExtensionFunction\x126\n\x17extension_uri_reference\x18\x01 \x01(\rR\x15extensionUriReference\x12\'\n\x0ffunction_anchor\x18\x02 \x01(\rR\x0efunctionAnchor\x12\x12\n\x04name\x18\x03 \x01(\tR\x04nameB\x0e\n\x0cmapping_type"\x85\x01\n\x11AdvancedExtension\x128\n\x0coptimization\x18\x01 \x01(\x0b2\x14.google.protobuf.AnyR\x0coptimization\x126\n\x0benhancement\x18\x02 \x01(\x0b2\x14.google.protobuf.AnyR\x0benhancementB5\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobufb\x06proto3')
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'substrait.ibis.extensions.extensions_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-    DESCRIPTOR._options = None
-    DESCRIPTOR._serialized_options = b'\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobuf'
-    _SIMPLEEXTENSIONURI._serialized_start = 100
-    _SIMPLEEXTENSIONURI._serialized_end = 188
-    _SIMPLEEXTENSIONDECLARATION._serialized_start = 191
-    _SIMPLEEXTENSIONDECLARATION._serialized_end = 1026
-    _SIMPLEEXTENSIONDECLARATION_EXTENSIONTYPE._serialized_start = 592
-    _SIMPLEEXTENSIONDECLARATION_EXTENSIONTYPE._serialized_end = 716
-    _SIMPLEEXTENSIONDECLARATION_EXTENSIONTYPEVARIATION._serialized_start = 719
-    _SIMPLEEXTENSIONDECLARATION_EXTENSIONTYPEVARIATION._serialized_end = 871
-    _SIMPLEEXTENSIONDECLARATION_EXTENSIONFUNCTION._serialized_start = 874
-    _SIMPLEEXTENSIONDECLARATION_EXTENSIONFUNCTION._serialized_end = 1010
-    _ADVANCEDEXTENSION._serialized_start = 1029
-    _ADVANCEDEXTENSION._serialized_end = 1162
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/ibis/extensions/extensions_pb2.pyi b/ibis_substrait/proto/substrait/ibis/extensions/extensions_pb2.pyi
deleted file mode 100644
index 3755046a..00000000
--- a/ibis_substrait/proto/substrait/ibis/extensions/extensions_pb2.pyi
+++ /dev/null
@@ -1,147 +0,0 @@
-"""
-@generated by mypy-protobuf.  Do not edit manually!
-isort:skip_file
-SPDX-License-Identifier: Apache-2.0"""
-import builtins
-import google.protobuf.any_pb2
-import google.protobuf.descriptor
-import google.protobuf.message
-import sys
-if sys.version_info >= (3, 8):
-    import typing as typing_extensions
-else:
-    import typing_extensions
-DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
-
-class SimpleExtensionURI(google.protobuf.message.Message):
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    EXTENSION_URI_ANCHOR_FIELD_NUMBER: builtins.int
-    URI_FIELD_NUMBER: builtins.int
-    extension_uri_anchor: builtins.int
-    'A surrogate key used in the context of a single plan used to reference the\n    URI associated with an extension.\n    '
-    uri: builtins.str
-    'The URI where this extension YAML can be retrieved. This is the "namespace"\n    of this extension.\n    '
-
-    def __init__(self, *, extension_uri_anchor: builtins.int=..., uri: builtins.str=...) -> None:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['extension_uri_anchor', b'extension_uri_anchor', 'uri', b'uri']) -> None:
-        ...
-global___SimpleExtensionURI = SimpleExtensionURI
-
-class SimpleExtensionDeclaration(google.protobuf.message.Message):
-    """Describes a mapping between a specific extension entity and the uri where
-    that extension can be found.
-    """
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class ExtensionType(google.protobuf.message.Message):
-        """Describes a Type"""
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        EXTENSION_URI_REFERENCE_FIELD_NUMBER: builtins.int
-        TYPE_ANCHOR_FIELD_NUMBER: builtins.int
-        NAME_FIELD_NUMBER: builtins.int
-        extension_uri_reference: builtins.int
-        'references the extension_uri_anchor defined for a specific extension URI.'
-        type_anchor: builtins.int
-        'A surrogate key used in the context of a single plan to reference a\n        specific extension type\n        '
-        name: builtins.str
-        'the name of the type in the defined extension YAML.'
-
-        def __init__(self, *, extension_uri_reference: builtins.int=..., type_anchor: builtins.int=..., name: builtins.str=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['extension_uri_reference', b'extension_uri_reference', 'name', b'name', 'type_anchor', b'type_anchor']) -> None:
-            ...
-
-    class ExtensionTypeVariation(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        EXTENSION_URI_REFERENCE_FIELD_NUMBER: builtins.int
-        TYPE_VARIATION_ANCHOR_FIELD_NUMBER: builtins.int
-        NAME_FIELD_NUMBER: builtins.int
-        extension_uri_reference: builtins.int
-        'references the extension_uri_anchor defined for a specific extension URI.'
-        type_variation_anchor: builtins.int
-        'A surrogate key used in the context of a single plan to reference a\n        specific type variation\n        '
-        name: builtins.str
-        'the name of the type in the defined extension YAML.'
-
-        def __init__(self, *, extension_uri_reference: builtins.int=..., type_variation_anchor: builtins.int=..., name: builtins.str=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['extension_uri_reference', b'extension_uri_reference', 'name', b'name', 'type_variation_anchor', b'type_variation_anchor']) -> None:
-            ...
-
-    class ExtensionFunction(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        EXTENSION_URI_REFERENCE_FIELD_NUMBER: builtins.int
-        FUNCTION_ANCHOR_FIELD_NUMBER: builtins.int
-        NAME_FIELD_NUMBER: builtins.int
-        extension_uri_reference: builtins.int
-        'references the extension_uri_anchor defined for a specific extension URI.'
-        function_anchor: builtins.int
-        'A surrogate key used in the context of a single plan to reference a\n        specific function\n        '
-        name: builtins.str
-        'A simple name if there is only one impl for the function within the YAML.\n        A compound name, referencing that includes type short names if there is\n        more than one impl per name in the YAML.\n        '
-
-        def __init__(self, *, extension_uri_reference: builtins.int=..., function_anchor: builtins.int=..., name: builtins.str=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['extension_uri_reference', b'extension_uri_reference', 'function_anchor', b'function_anchor', 'name', b'name']) -> None:
-            ...
-    EXTENSION_TYPE_FIELD_NUMBER: builtins.int
-    EXTENSION_TYPE_VARIATION_FIELD_NUMBER: builtins.int
-    EXTENSION_FUNCTION_FIELD_NUMBER: builtins.int
-
-    @property
-    def extension_type(self) -> global___SimpleExtensionDeclaration.ExtensionType:
-        ...
-
-    @property
-    def extension_type_variation(self) -> global___SimpleExtensionDeclaration.ExtensionTypeVariation:
-        ...
-
-    @property
-    def extension_function(self) -> global___SimpleExtensionDeclaration.ExtensionFunction:
-        ...
-
-    def __init__(self, *, extension_type: global___SimpleExtensionDeclaration.ExtensionType | None=..., extension_type_variation: global___SimpleExtensionDeclaration.ExtensionTypeVariation | None=..., extension_function: global___SimpleExtensionDeclaration.ExtensionFunction | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['extension_function', b'extension_function', 'extension_type', b'extension_type', 'extension_type_variation', b'extension_type_variation', 'mapping_type', b'mapping_type']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['extension_function', b'extension_function', 'extension_type', b'extension_type', 'extension_type_variation', b'extension_type_variation', 'mapping_type', b'mapping_type']) -> None:
-        ...
-
-    def WhichOneof(self, oneof_group: typing_extensions.Literal['mapping_type', b'mapping_type']) -> typing_extensions.Literal['extension_type', 'extension_type_variation', 'extension_function'] | None:
-        ...
-global___SimpleExtensionDeclaration = SimpleExtensionDeclaration
-
-class AdvancedExtension(google.protobuf.message.Message):
-    """A generic object that can be used to embed additional extension information
-    into the serialized substrait plan.
-    """
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    OPTIMIZATION_FIELD_NUMBER: builtins.int
-    ENHANCEMENT_FIELD_NUMBER: builtins.int
-
-    @property
-    def optimization(self) -> google.protobuf.any_pb2.Any:
-        """An optimization is helpful information that don't influence semantics. May
-        be ignored by a consumer.
-        """
-
-    @property
-    def enhancement(self) -> google.protobuf.any_pb2.Any:
-        """An enhancement alter semantics. Cannot be ignored by a consumer."""
-
-    def __init__(self, *, optimization: google.protobuf.any_pb2.Any | None=..., enhancement: google.protobuf.any_pb2.Any | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['enhancement', b'enhancement', 'optimization', b'optimization']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['enhancement', b'enhancement', 'optimization', b'optimization']) -> None:
-        ...
-global___AdvancedExtension = AdvancedExtension
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/ibis/function_pb2.py b/ibis_substrait/proto/substrait/ibis/function_pb2.py
deleted file mode 100644
index 26bdedb9..00000000
--- a/ibis_substrait/proto/substrait/ibis/function_pb2.py
+++ /dev/null
@@ -1,45 +0,0 @@
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-_sym_db = _symbol_database.Default()
-from ...substrait.ibis import parameterized_types_pb2 as substrait_dot_ibis_dot_parameterized__types__pb2
-from ...substrait.ibis import type_pb2 as substrait_dot_ibis_dot_type__pb2
-from ...substrait.ibis import type_expressions_pb2 as substrait_dot_ibis_dot_type__expressions__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dsubstrait/ibis/function.proto\x12\x0esubstrait.ibis\x1a(substrait/ibis/parameterized_types.proto\x1a\x19substrait/ibis/type.proto\x1a%substrait/ibis/type_expressions.proto"\xe5\x1a\n\x11FunctionSignature\x1a\xc1\x02\n\x10FinalArgVariadic\x12\x19\n\x08min_args\x18\x01 \x01(\x03R\x07minArgs\x12\x19\n\x08max_args\x18\x02 \x01(\x03R\x07maxArgs\x12i\n\x0bconsistency\x18\x03 \x01(\x0e2G.substrait.ibis.FunctionSignature.FinalArgVariadic.ParameterConsistencyR\x0bconsistency"\x8b\x01\n\x14ParameterConsistency\x12%\n!PARAMETER_CONSISTENCY_UNSPECIFIED\x10\x00\x12$\n PARAMETER_CONSISTENCY_CONSISTENT\x10\x01\x12&\n"PARAMETER_CONSISTENCY_INCONSISTENT\x10\x02\x1a\x10\n\x0eFinalArgNormal\x1a\xe6\x04\n\x06Scalar\x12H\n\targuments\x18\x02 \x03(\x0b2*.substrait.ibis.FunctionSignature.ArgumentR\targuments\x12\x12\n\x04name\x18\x03 \x03(\tR\x04name\x12O\n\x0bdescription\x18\x04 \x01(\x0b2-.substrait.ibis.FunctionSignature.DescriptionR\x0bdescription\x12$\n\rdeterministic\x18\x07 \x01(\x08R\rdeterministic\x12+\n\x11session_dependent\x18\x08 \x01(\x08R\x10sessionDependent\x12E\n\x0boutput_type\x18\t \x01(\x0b2$.substrait.ibis.DerivationExpressionR\noutputType\x12P\n\x08variadic\x18\n \x01(\x0b22.substrait.ibis.FunctionSignature.FinalArgVariadicH\x00R\x08variadic\x12J\n\x06normal\x18\x0b \x01(\x0b20.substrait.ibis.FunctionSignature.FinalArgNormalH\x00R\x06normal\x12Z\n\x0fimplementations\x18\x0c \x03(\x0b20.substrait.ibis.FunctionSignature.ImplementationR\x0fimplementationsB\x19\n\x17final_variable_behavior\x1a\xdf\x05\n\tAggregate\x12H\n\targuments\x18\x02 \x03(\x0b2*.substrait.ibis.FunctionSignature.ArgumentR\targuments\x12\x12\n\x04name\x18\x03 \x01(\tR\x04name\x12O\n\x0bdescription\x18\x04 \x01(\x0b2-.substrait.ibis.FunctionSignature.DescriptionR\x0bdescription\x12$\n\rdeterministic\x18\x07 \x01(\x08R\rdeterministic\x12+\n\x11session_dependent\x18\x08 \x01(\x08R\x10sessionDependent\x12E\n\x0boutput_type\x18\t \x01(\x0b2$.substrait.ibis.DerivationExpressionR\noutputType\x12P\n\x08variadic\x18\n \x01(\x0b22.substrait.ibis.FunctionSignature.FinalArgVariadicH\x00R\x08variadic\x12J\n\x06normal\x18\x0b \x01(\x0b20.substrait.ibis.FunctionSignature.FinalArgNormalH\x00R\x06normal\x12\x18\n\x07ordered\x18\x0e \x01(\x08R\x07ordered\x12\x17\n\x07max_set\x18\x0c \x01(\x04R\x06maxSet\x12A\n\x11intermediate_type\x18\r \x01(\x0b2\x14.substrait.ibis.TypeR\x10intermediateType\x12Z\n\x0fimplementations\x18\x0f \x03(\x0b20.substrait.ibis.FunctionSignature.ImplementationR\x0fimplementationsB\x19\n\x17final_variable_behavior\x1a\xa3\x07\n\x06Window\x12H\n\targuments\x18\x02 \x03(\x0b2*.substrait.ibis.FunctionSignature.ArgumentR\targuments\x12\x12\n\x04name\x18\x03 \x03(\tR\x04name\x12O\n\x0bdescription\x18\x04 \x01(\x0b2-.substrait.ibis.FunctionSignature.DescriptionR\x0bdescription\x12$\n\rdeterministic\x18\x07 \x01(\x08R\rdeterministic\x12+\n\x11session_dependent\x18\x08 \x01(\x08R\x10sessionDependent\x12Q\n\x11intermediate_type\x18\t \x01(\x0b2$.substrait.ibis.DerivationExpressionR\x10intermediateType\x12E\n\x0boutput_type\x18\n \x01(\x0b2$.substrait.ibis.DerivationExpressionR\noutputType\x12P\n\x08variadic\x18\x10 \x01(\x0b22.substrait.ibis.FunctionSignature.FinalArgVariadicH\x00R\x08variadic\x12J\n\x06normal\x18\x11 \x01(\x0b20.substrait.ibis.FunctionSignature.FinalArgNormalH\x00R\x06normal\x12\x18\n\x07ordered\x18\x0b \x01(\x08R\x07ordered\x12\x17\n\x07max_set\x18\x0c \x01(\x04R\x06maxSet\x12T\n\x0bwindow_type\x18\x0e \x01(\x0e23.substrait.ibis.FunctionSignature.Window.WindowTypeR\nwindowType\x12Z\n\x0fimplementations\x18\x0f \x03(\x0b20.substrait.ibis.FunctionSignature.ImplementationR\x0fimplementations"_\n\nWindowType\x12\x1b\n\x17WINDOW_TYPE_UNSPECIFIED\x10\x00\x12\x19\n\x15WINDOW_TYPE_STREAMING\x10\x01\x12\x19\n\x15WINDOW_TYPE_PARTITION\x10\x02B\x19\n\x17final_variable_behavior\x1a=\n\x0bDescription\x12\x1a\n\x08language\x18\x01 \x01(\tR\x08language\x12\x12\n\x04body\x18\x02 \x01(\tR\x04body\x1a\xb6\x01\n\x0eImplementation\x12I\n\x04type\x18\x01 \x01(\x0e25.substrait.ibis.FunctionSignature.Implementation.TypeR\x04type\x12\x10\n\x03uri\x18\x02 \x01(\tR\x03uri"G\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x15\n\x11TYPE_WEB_ASSEMBLY\x10\x01\x12\x12\n\x0eTYPE_TRINO_JAR\x10\x02\x1a\x90\x04\n\x08Argument\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12P\n\x05value\x18\x02 \x01(\x0b28.substrait.ibis.FunctionSignature.Argument.ValueArgumentH\x00R\x05value\x12M\n\x04type\x18\x03 \x01(\x0b27.substrait.ibis.FunctionSignature.Argument.TypeArgumentH\x00R\x04type\x12M\n\x04enum\x18\x04 \x01(\x0b27.substrait.ibis.FunctionSignature.Argument.EnumArgumentH\x00R\x04enum\x1ab\n\rValueArgument\x125\n\x04type\x18\x01 \x01(\x0b2!.substrait.ibis.ParameterizedTypeR\x04type\x12\x1a\n\x08constant\x18\x02 \x01(\x08R\x08constant\x1aE\n\x0cTypeArgument\x125\n\x04type\x18\x01 \x01(\x0b2!.substrait.ibis.ParameterizedTypeR\x04type\x1aD\n\x0cEnumArgument\x12\x18\n\x07options\x18\x01 \x03(\tR\x07options\x12\x1a\n\x08optional\x18\x02 \x01(\x08R\x08optionalB\x0f\n\rargument_kindB5\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobufb\x06proto3')
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'substrait.ibis.function_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-    DESCRIPTOR._options = None
-    DESCRIPTOR._serialized_options = b'\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobuf'
-    _FUNCTIONSIGNATURE._serialized_start = 158
-    _FUNCTIONSIGNATURE._serialized_end = 3587
-    _FUNCTIONSIGNATURE_FINALARGVARIADIC._serialized_start = 180
-    _FUNCTIONSIGNATURE_FINALARGVARIADIC._serialized_end = 501
-    _FUNCTIONSIGNATURE_FINALARGVARIADIC_PARAMETERCONSISTENCY._serialized_start = 362
-    _FUNCTIONSIGNATURE_FINALARGVARIADIC_PARAMETERCONSISTENCY._serialized_end = 501
-    _FUNCTIONSIGNATURE_FINALARGNORMAL._serialized_start = 503
-    _FUNCTIONSIGNATURE_FINALARGNORMAL._serialized_end = 519
-    _FUNCTIONSIGNATURE_SCALAR._serialized_start = 522
-    _FUNCTIONSIGNATURE_SCALAR._serialized_end = 1136
-    _FUNCTIONSIGNATURE_AGGREGATE._serialized_start = 1139
-    _FUNCTIONSIGNATURE_AGGREGATE._serialized_end = 1874
-    _FUNCTIONSIGNATURE_WINDOW._serialized_start = 1877
-    _FUNCTIONSIGNATURE_WINDOW._serialized_end = 2808
-    _FUNCTIONSIGNATURE_WINDOW_WINDOWTYPE._serialized_start = 2686
-    _FUNCTIONSIGNATURE_WINDOW_WINDOWTYPE._serialized_end = 2781
-    _FUNCTIONSIGNATURE_DESCRIPTION._serialized_start = 2810
-    _FUNCTIONSIGNATURE_DESCRIPTION._serialized_end = 2871
-    _FUNCTIONSIGNATURE_IMPLEMENTATION._serialized_start = 2874
-    _FUNCTIONSIGNATURE_IMPLEMENTATION._serialized_end = 3056
-    _FUNCTIONSIGNATURE_IMPLEMENTATION_TYPE._serialized_start = 2985
-    _FUNCTIONSIGNATURE_IMPLEMENTATION_TYPE._serialized_end = 3056
-    _FUNCTIONSIGNATURE_ARGUMENT._serialized_start = 3059
-    _FUNCTIONSIGNATURE_ARGUMENT._serialized_end = 3587
-    _FUNCTIONSIGNATURE_ARGUMENT_VALUEARGUMENT._serialized_start = 3331
-    _FUNCTIONSIGNATURE_ARGUMENT_VALUEARGUMENT._serialized_end = 3429
-    _FUNCTIONSIGNATURE_ARGUMENT_TYPEARGUMENT._serialized_start = 3431
-    _FUNCTIONSIGNATURE_ARGUMENT_TYPEARGUMENT._serialized_end = 3500
-    _FUNCTIONSIGNATURE_ARGUMENT_ENUMARGUMENT._serialized_start = 3502
-    _FUNCTIONSIGNATURE_ARGUMENT_ENUMARGUMENT._serialized_end = 3570
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/ibis/function_pb2.pyi b/ibis_substrait/proto/substrait/ibis/function_pb2.pyi
deleted file mode 100644
index d2e09052..00000000
--- a/ibis_substrait/proto/substrait/ibis/function_pb2.pyi
+++ /dev/null
@@ -1,391 +0,0 @@
-"""
-@generated by mypy-protobuf.  Do not edit manually!
-isort:skip_file
-SPDX-License-Identifier: Apache-2.0"""
-import builtins
-import collections.abc
-import google.protobuf.descriptor
-import google.protobuf.internal.containers
-import google.protobuf.internal.enum_type_wrapper
-import google.protobuf.message
-from ... import substrait
-import sys
-import typing
-if sys.version_info >= (3, 10):
-    import typing as typing_extensions
-else:
-    import typing_extensions
-DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
-
-class FunctionSignature(google.protobuf.message.Message):
-    """List of function signatures available."""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class FinalArgVariadic(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class _ParameterConsistency:
-            ValueType = typing.NewType('ValueType', builtins.int)
-            V: typing_extensions.TypeAlias = ValueType
-
-        class _ParameterConsistencyEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[FunctionSignature.FinalArgVariadic._ParameterConsistency.ValueType], builtins.type):
-            DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-            PARAMETER_CONSISTENCY_UNSPECIFIED: FunctionSignature.FinalArgVariadic._ParameterConsistency.ValueType
-            PARAMETER_CONSISTENCY_CONSISTENT: FunctionSignature.FinalArgVariadic._ParameterConsistency.ValueType
-            'All argument must be the same concrete type.'
-            PARAMETER_CONSISTENCY_INCONSISTENT: FunctionSignature.FinalArgVariadic._ParameterConsistency.ValueType
-            'Each argument can be any possible concrete type afforded by the bounds\n            of any parameter defined in the arguments specification.\n            '
-
-        class ParameterConsistency(_ParameterConsistency, metaclass=_ParameterConsistencyEnumTypeWrapper):
-            ...
-        PARAMETER_CONSISTENCY_UNSPECIFIED: FunctionSignature.FinalArgVariadic.ParameterConsistency.ValueType
-        PARAMETER_CONSISTENCY_CONSISTENT: FunctionSignature.FinalArgVariadic.ParameterConsistency.ValueType
-        'All argument must be the same concrete type.'
-        PARAMETER_CONSISTENCY_INCONSISTENT: FunctionSignature.FinalArgVariadic.ParameterConsistency.ValueType
-        'Each argument can be any possible concrete type afforded by the bounds\n        of any parameter defined in the arguments specification.\n        '
-        MIN_ARGS_FIELD_NUMBER: builtins.int
-        MAX_ARGS_FIELD_NUMBER: builtins.int
-        CONSISTENCY_FIELD_NUMBER: builtins.int
-        min_args: builtins.int
-        'the minimum number of arguments allowed for the list of final arguments\n        (inclusive).\n        '
-        max_args: builtins.int
-        'the maximum number of arguments allowed for the list of final arguments\n        (exclusive)\n        '
-        consistency: global___FunctionSignature.FinalArgVariadic.ParameterConsistency.ValueType
-        'the type of parameterized type consistency'
-
-        def __init__(self, *, min_args: builtins.int=..., max_args: builtins.int=..., consistency: global___FunctionSignature.FinalArgVariadic.ParameterConsistency.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['consistency', b'consistency', 'max_args', b'max_args', 'min_args', b'min_args']) -> None:
-            ...
-
-    class FinalArgNormal(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        def __init__(self) -> None:
-            ...
-
-    class Scalar(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        ARGUMENTS_FIELD_NUMBER: builtins.int
-        NAME_FIELD_NUMBER: builtins.int
-        DESCRIPTION_FIELD_NUMBER: builtins.int
-        DETERMINISTIC_FIELD_NUMBER: builtins.int
-        SESSION_DEPENDENT_FIELD_NUMBER: builtins.int
-        OUTPUT_TYPE_FIELD_NUMBER: builtins.int
-        VARIADIC_FIELD_NUMBER: builtins.int
-        NORMAL_FIELD_NUMBER: builtins.int
-        IMPLEMENTATIONS_FIELD_NUMBER: builtins.int
-
-        @property
-        def arguments(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FunctionSignature.Argument]:
-            ...
-
-        @property
-        def name(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-            ...
-
-        @property
-        def description(self) -> global___FunctionSignature.Description:
-            ...
-        deterministic: builtins.bool
-        session_dependent: builtins.bool
-
-        @property
-        def output_type(self) -> substrait.ibis.type_expressions_pb2.DerivationExpression:
-            ...
-
-        @property
-        def variadic(self) -> global___FunctionSignature.FinalArgVariadic:
-            ...
-
-        @property
-        def normal(self) -> global___FunctionSignature.FinalArgNormal:
-            ...
-
-        @property
-        def implementations(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FunctionSignature.Implementation]:
-            ...
-
-        def __init__(self, *, arguments: collections.abc.Iterable[global___FunctionSignature.Argument] | None=..., name: collections.abc.Iterable[builtins.str] | None=..., description: global___FunctionSignature.Description | None=..., deterministic: builtins.bool=..., session_dependent: builtins.bool=..., output_type: substrait.ibis.type_expressions_pb2.DerivationExpression | None=..., variadic: global___FunctionSignature.FinalArgVariadic | None=..., normal: global___FunctionSignature.FinalArgNormal | None=..., implementations: collections.abc.Iterable[global___FunctionSignature.Implementation] | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['description', b'description', 'final_variable_behavior', b'final_variable_behavior', 'normal', b'normal', 'output_type', b'output_type', 'variadic', b'variadic']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['arguments', b'arguments', 'description', b'description', 'deterministic', b'deterministic', 'final_variable_behavior', b'final_variable_behavior', 'implementations', b'implementations', 'name', b'name', 'normal', b'normal', 'output_type', b'output_type', 'session_dependent', b'session_dependent', 'variadic', b'variadic']) -> None:
-            ...
-
-        def WhichOneof(self, oneof_group: typing_extensions.Literal['final_variable_behavior', b'final_variable_behavior']) -> typing_extensions.Literal['variadic', 'normal'] | None:
-            ...
-
-    class Aggregate(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        ARGUMENTS_FIELD_NUMBER: builtins.int
-        NAME_FIELD_NUMBER: builtins.int
-        DESCRIPTION_FIELD_NUMBER: builtins.int
-        DETERMINISTIC_FIELD_NUMBER: builtins.int
-        SESSION_DEPENDENT_FIELD_NUMBER: builtins.int
-        OUTPUT_TYPE_FIELD_NUMBER: builtins.int
-        VARIADIC_FIELD_NUMBER: builtins.int
-        NORMAL_FIELD_NUMBER: builtins.int
-        ORDERED_FIELD_NUMBER: builtins.int
-        MAX_SET_FIELD_NUMBER: builtins.int
-        INTERMEDIATE_TYPE_FIELD_NUMBER: builtins.int
-        IMPLEMENTATIONS_FIELD_NUMBER: builtins.int
-
-        @property
-        def arguments(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FunctionSignature.Argument]:
-            ...
-        name: builtins.str
-
-        @property
-        def description(self) -> global___FunctionSignature.Description:
-            ...
-        deterministic: builtins.bool
-        session_dependent: builtins.bool
-
-        @property
-        def output_type(self) -> substrait.ibis.type_expressions_pb2.DerivationExpression:
-            ...
-
-        @property
-        def variadic(self) -> global___FunctionSignature.FinalArgVariadic:
-            ...
-
-        @property
-        def normal(self) -> global___FunctionSignature.FinalArgNormal:
-            ...
-        ordered: builtins.bool
-        max_set: builtins.int
-
-        @property
-        def intermediate_type(self) -> substrait.ibis.type_pb2.Type:
-            ...
-
-        @property
-        def implementations(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FunctionSignature.Implementation]:
-            ...
-
-        def __init__(self, *, arguments: collections.abc.Iterable[global___FunctionSignature.Argument] | None=..., name: builtins.str=..., description: global___FunctionSignature.Description | None=..., deterministic: builtins.bool=..., session_dependent: builtins.bool=..., output_type: substrait.ibis.type_expressions_pb2.DerivationExpression | None=..., variadic: global___FunctionSignature.FinalArgVariadic | None=..., normal: global___FunctionSignature.FinalArgNormal | None=..., ordered: builtins.bool=..., max_set: builtins.int=..., intermediate_type: substrait.ibis.type_pb2.Type | None=..., implementations: collections.abc.Iterable[global___FunctionSignature.Implementation] | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['description', b'description', 'final_variable_behavior', b'final_variable_behavior', 'intermediate_type', b'intermediate_type', 'normal', b'normal', 'output_type', b'output_type', 'variadic', b'variadic']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['arguments', b'arguments', 'description', b'description', 'deterministic', b'deterministic', 'final_variable_behavior', b'final_variable_behavior', 'implementations', b'implementations', 'intermediate_type', b'intermediate_type', 'max_set', b'max_set', 'name', b'name', 'normal', b'normal', 'ordered', b'ordered', 'output_type', b'output_type', 'session_dependent', b'session_dependent', 'variadic', b'variadic']) -> None:
-            ...
-
-        def WhichOneof(self, oneof_group: typing_extensions.Literal['final_variable_behavior', b'final_variable_behavior']) -> typing_extensions.Literal['variadic', 'normal'] | None:
-            ...
-
-    class Window(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class _WindowType:
-            ValueType = typing.NewType('ValueType', builtins.int)
-            V: typing_extensions.TypeAlias = ValueType
-
-        class _WindowTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[FunctionSignature.Window._WindowType.ValueType], builtins.type):
-            DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-            WINDOW_TYPE_UNSPECIFIED: FunctionSignature.Window._WindowType.ValueType
-            WINDOW_TYPE_STREAMING: FunctionSignature.Window._WindowType.ValueType
-            WINDOW_TYPE_PARTITION: FunctionSignature.Window._WindowType.ValueType
-
-        class WindowType(_WindowType, metaclass=_WindowTypeEnumTypeWrapper):
-            ...
-        WINDOW_TYPE_UNSPECIFIED: FunctionSignature.Window.WindowType.ValueType
-        WINDOW_TYPE_STREAMING: FunctionSignature.Window.WindowType.ValueType
-        WINDOW_TYPE_PARTITION: FunctionSignature.Window.WindowType.ValueType
-        ARGUMENTS_FIELD_NUMBER: builtins.int
-        NAME_FIELD_NUMBER: builtins.int
-        DESCRIPTION_FIELD_NUMBER: builtins.int
-        DETERMINISTIC_FIELD_NUMBER: builtins.int
-        SESSION_DEPENDENT_FIELD_NUMBER: builtins.int
-        INTERMEDIATE_TYPE_FIELD_NUMBER: builtins.int
-        OUTPUT_TYPE_FIELD_NUMBER: builtins.int
-        VARIADIC_FIELD_NUMBER: builtins.int
-        NORMAL_FIELD_NUMBER: builtins.int
-        ORDERED_FIELD_NUMBER: builtins.int
-        MAX_SET_FIELD_NUMBER: builtins.int
-        WINDOW_TYPE_FIELD_NUMBER: builtins.int
-        IMPLEMENTATIONS_FIELD_NUMBER: builtins.int
-
-        @property
-        def arguments(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FunctionSignature.Argument]:
-            ...
-
-        @property
-        def name(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-            ...
-
-        @property
-        def description(self) -> global___FunctionSignature.Description:
-            ...
-        deterministic: builtins.bool
-        session_dependent: builtins.bool
-
-        @property
-        def intermediate_type(self) -> substrait.ibis.type_expressions_pb2.DerivationExpression:
-            ...
-
-        @property
-        def output_type(self) -> substrait.ibis.type_expressions_pb2.DerivationExpression:
-            ...
-
-        @property
-        def variadic(self) -> global___FunctionSignature.FinalArgVariadic:
-            ...
-
-        @property
-        def normal(self) -> global___FunctionSignature.FinalArgNormal:
-            ...
-        ordered: builtins.bool
-        max_set: builtins.int
-        window_type: global___FunctionSignature.Window.WindowType.ValueType
-
-        @property
-        def implementations(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FunctionSignature.Implementation]:
-            ...
-
-        def __init__(self, *, arguments: collections.abc.Iterable[global___FunctionSignature.Argument] | None=..., name: collections.abc.Iterable[builtins.str] | None=..., description: global___FunctionSignature.Description | None=..., deterministic: builtins.bool=..., session_dependent: builtins.bool=..., intermediate_type: substrait.ibis.type_expressions_pb2.DerivationExpression | None=..., output_type: substrait.ibis.type_expressions_pb2.DerivationExpression | None=..., variadic: global___FunctionSignature.FinalArgVariadic | None=..., normal: global___FunctionSignature.FinalArgNormal | None=..., ordered: builtins.bool=..., max_set: builtins.int=..., window_type: global___FunctionSignature.Window.WindowType.ValueType=..., implementations: collections.abc.Iterable[global___FunctionSignature.Implementation] | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['description', b'description', 'final_variable_behavior', b'final_variable_behavior', 'intermediate_type', b'intermediate_type', 'normal', b'normal', 'output_type', b'output_type', 'variadic', b'variadic']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['arguments', b'arguments', 'description', b'description', 'deterministic', b'deterministic', 'final_variable_behavior', b'final_variable_behavior', 'implementations', b'implementations', 'intermediate_type', b'intermediate_type', 'max_set', b'max_set', 'name', b'name', 'normal', b'normal', 'ordered', b'ordered', 'output_type', b'output_type', 'session_dependent', b'session_dependent', 'variadic', b'variadic', 'window_type', b'window_type']) -> None:
-            ...
-
-        def WhichOneof(self, oneof_group: typing_extensions.Literal['final_variable_behavior', b'final_variable_behavior']) -> typing_extensions.Literal['variadic', 'normal'] | None:
-            ...
-
-    class Description(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        LANGUAGE_FIELD_NUMBER: builtins.int
-        BODY_FIELD_NUMBER: builtins.int
-        language: builtins.str
-        body: builtins.str
-
-        def __init__(self, *, language: builtins.str=..., body: builtins.str=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['body', b'body', 'language', b'language']) -> None:
-            ...
-
-    class Implementation(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class _Type:
-            ValueType = typing.NewType('ValueType', builtins.int)
-            V: typing_extensions.TypeAlias = ValueType
-
-        class _TypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[FunctionSignature.Implementation._Type.ValueType], builtins.type):
-            DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-            TYPE_UNSPECIFIED: FunctionSignature.Implementation._Type.ValueType
-            TYPE_WEB_ASSEMBLY: FunctionSignature.Implementation._Type.ValueType
-            TYPE_TRINO_JAR: FunctionSignature.Implementation._Type.ValueType
-
-        class Type(_Type, metaclass=_TypeEnumTypeWrapper):
-            ...
-        TYPE_UNSPECIFIED: FunctionSignature.Implementation.Type.ValueType
-        TYPE_WEB_ASSEMBLY: FunctionSignature.Implementation.Type.ValueType
-        TYPE_TRINO_JAR: FunctionSignature.Implementation.Type.ValueType
-        TYPE_FIELD_NUMBER: builtins.int
-        URI_FIELD_NUMBER: builtins.int
-        type: global___FunctionSignature.Implementation.Type.ValueType
-        uri: builtins.str
-
-        def __init__(self, *, type: global___FunctionSignature.Implementation.Type.ValueType=..., uri: builtins.str=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['type', b'type', 'uri', b'uri']) -> None:
-            ...
-
-    class Argument(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class ValueArgument(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            TYPE_FIELD_NUMBER: builtins.int
-            CONSTANT_FIELD_NUMBER: builtins.int
-
-            @property
-            def type(self) -> substrait.ibis.parameterized_types_pb2.ParameterizedType:
-                ...
-            constant: builtins.bool
-
-            def __init__(self, *, type: substrait.ibis.parameterized_types_pb2.ParameterizedType | None=..., constant: builtins.bool=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['type', b'type']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['constant', b'constant', 'type', b'type']) -> None:
-                ...
-
-        class TypeArgument(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            TYPE_FIELD_NUMBER: builtins.int
-
-            @property
-            def type(self) -> substrait.ibis.parameterized_types_pb2.ParameterizedType:
-                ...
-
-            def __init__(self, *, type: substrait.ibis.parameterized_types_pb2.ParameterizedType | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['type', b'type']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['type', b'type']) -> None:
-                ...
-
-        class EnumArgument(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            OPTIONS_FIELD_NUMBER: builtins.int
-            OPTIONAL_FIELD_NUMBER: builtins.int
-
-            @property
-            def options(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-                ...
-            optional: builtins.bool
-
-            def __init__(self, *, options: collections.abc.Iterable[builtins.str] | None=..., optional: builtins.bool=...) -> None:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['optional', b'optional', 'options', b'options']) -> None:
-                ...
-        NAME_FIELD_NUMBER: builtins.int
-        VALUE_FIELD_NUMBER: builtins.int
-        TYPE_FIELD_NUMBER: builtins.int
-        ENUM_FIELD_NUMBER: builtins.int
-        name: builtins.str
-
-        @property
-        def value(self) -> global___FunctionSignature.Argument.ValueArgument:
-            ...
-
-        @property
-        def type(self) -> global___FunctionSignature.Argument.TypeArgument:
-            ...
-
-        @property
-        def enum(self) -> global___FunctionSignature.Argument.EnumArgument:
-            ...
-
-        def __init__(self, *, name: builtins.str=..., value: global___FunctionSignature.Argument.ValueArgument | None=..., type: global___FunctionSignature.Argument.TypeArgument | None=..., enum: global___FunctionSignature.Argument.EnumArgument | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['argument_kind', b'argument_kind', 'enum', b'enum', 'type', b'type', 'value', b'value']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['argument_kind', b'argument_kind', 'enum', b'enum', 'name', b'name', 'type', b'type', 'value', b'value']) -> None:
-            ...
-
-        def WhichOneof(self, oneof_group: typing_extensions.Literal['argument_kind', b'argument_kind']) -> typing_extensions.Literal['value', 'type', 'enum'] | None:
-            ...
-
-    def __init__(self) -> None:
-        ...
-global___FunctionSignature = FunctionSignature
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/ibis/parameterized_types_pb2.py b/ibis_substrait/proto/substrait/ibis/parameterized_types_pb2.py
deleted file mode 100644
index 64696fcf..00000000
--- a/ibis_substrait/proto/substrait/ibis/parameterized_types_pb2.py
+++ /dev/null
@@ -1,43 +0,0 @@
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-_sym_db = _symbol_database.Default()
-from ...substrait.ibis import type_pb2 as substrait_dot_ibis_dot_type__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(substrait/ibis/parameterized_types.proto\x12\x0esubstrait.ibis\x1a\x19substrait/ibis/type.proto"\x8d \n\x11ParameterizedType\x122\n\x04bool\x18\x01 \x01(\x0b2\x1c.substrait.ibis.Type.BooleanH\x00R\x04bool\x12)\n\x02i8\x18\x02 \x01(\x0b2\x17.substrait.ibis.Type.I8H\x00R\x02i8\x12,\n\x03i16\x18\x03 \x01(\x0b2\x18.substrait.ibis.Type.I16H\x00R\x03i16\x12,\n\x03i32\x18\x05 \x01(\x0b2\x18.substrait.ibis.Type.I32H\x00R\x03i32\x12,\n\x03i64\x18\x07 \x01(\x0b2\x18.substrait.ibis.Type.I64H\x00R\x03i64\x12/\n\x04fp32\x18\n \x01(\x0b2\x19.substrait.ibis.Type.FP32H\x00R\x04fp32\x12/\n\x04fp64\x18\x0b \x01(\x0b2\x19.substrait.ibis.Type.FP64H\x00R\x04fp64\x125\n\x06string\x18\x0c \x01(\x0b2\x1b.substrait.ibis.Type.StringH\x00R\x06string\x125\n\x06binary\x18\r \x01(\x0b2\x1b.substrait.ibis.Type.BinaryH\x00R\x06binary\x12>\n\ttimestamp\x18\x0e \x01(\x0b2\x1e.substrait.ibis.Type.TimestampH\x00R\ttimestamp\x12/\n\x04date\x18\x10 \x01(\x0b2\x19.substrait.ibis.Type.DateH\x00R\x04date\x12/\n\x04time\x18\x11 \x01(\x0b2\x19.substrait.ibis.Type.TimeH\x00R\x04time\x12H\n\rinterval_year\x18\x13 \x01(\x0b2!.substrait.ibis.Type.IntervalYearH\x00R\x0cintervalYear\x12E\n\x0cinterval_day\x18\x14 \x01(\x0b2 .substrait.ibis.Type.IntervalDayH\x00R\x0bintervalDay\x12E\n\x0ctimestamp_tz\x18\x1d \x01(\x0b2 .substrait.ibis.Type.TimestampTZH\x00R\x0btimestampTz\x12/\n\x04uuid\x18  \x01(\x0b2\x19.substrait.ibis.Type.UUIDH\x00R\x04uuid\x12Y\n\nfixed_char\x18\x15 \x01(\x0b28.substrait.ibis.ParameterizedType.ParameterizedFixedCharH\x00R\tfixedChar\x12R\n\x07varchar\x18\x16 \x01(\x0b26.substrait.ibis.ParameterizedType.ParameterizedVarCharH\x00R\x07varchar\x12_\n\x0cfixed_binary\x18\x17 \x01(\x0b2:.substrait.ibis.ParameterizedType.ParameterizedFixedBinaryH\x00R\x0bfixedBinary\x12R\n\x07decimal\x18\x18 \x01(\x0b26.substrait.ibis.ParameterizedType.ParameterizedDecimalH\x00R\x07decimal\x12O\n\x06struct\x18\x19 \x01(\x0b25.substrait.ibis.ParameterizedType.ParameterizedStructH\x00R\x06struct\x12I\n\x04list\x18\x1b \x01(\x0b23.substrait.ibis.ParameterizedType.ParameterizedListH\x00R\x04list\x12F\n\x03map\x18\x1c \x01(\x0b22.substrait.ibis.ParameterizedType.ParameterizedMapH\x00R\x03map\x12_\n\x0cuser_defined\x18\x1e \x01(\x0b2:.substrait.ibis.ParameterizedType.ParameterizedUserDefinedH\x00R\x0buserDefined\x126\n\x14user_defined_pointer\x18\x1f \x01(\rB\x02\x18\x01H\x00R\x12userDefinedPointer\x12X\n\x0etype_parameter\x18! \x01(\x0b2/.substrait.ibis.ParameterizedType.TypeParameterH\x00R\rtypeParameter\x1a^\n\rTypeParameter\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x129\n\x06bounds\x18\x02 \x03(\x0b2!.substrait.ibis.ParameterizedTypeR\x06bounds\x1a\xf0\x01\n\x10IntegerParameter\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12e\n\x15range_start_inclusive\x18\x02 \x01(\x0b21.substrait.ibis.ParameterizedType.NullableIntegerR\x13rangeStartInclusive\x12a\n\x13range_end_exclusive\x18\x03 \x01(\x0b21.substrait.ibis.ParameterizedType.NullableIntegerR\x11rangeEndExclusive\x1a\'\n\x0fNullableInteger\x12\x14\n\x05value\x18\x01 \x01(\x03R\x05value\x1a\xd2\x01\n\x16ParameterizedFixedChar\x12G\n\x06length\x18\x01 \x01(\x0b2/.substrait.ibis.ParameterizedType.IntegerOptionR\x06length\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xd0\x01\n\x14ParameterizedVarChar\x12G\n\x06length\x18\x01 \x01(\x0b2/.substrait.ibis.ParameterizedType.IntegerOptionR\x06length\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xd4\x01\n\x18ParameterizedFixedBinary\x12G\n\x06length\x18\x01 \x01(\x0b2/.substrait.ibis.ParameterizedType.IntegerOptionR\x06length\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x9d\x02\n\x14ParameterizedDecimal\x12E\n\x05scale\x18\x01 \x01(\x0b2/.substrait.ibis.ParameterizedType.IntegerOptionR\x05scale\x12M\n\tprecision\x18\x02 \x01(\x0b2/.substrait.ibis.ParameterizedType.IntegerOptionR\tprecision\x12+\n\x11variation_pointer\x18\x03 \x01(\rR\x10variationPointer\x12B\n\x0bnullability\x18\x04 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xbf\x01\n\x13ParameterizedStruct\x127\n\x05types\x18\x01 \x03(\x0b2!.substrait.ibis.ParameterizedTypeR\x05types\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x7f\n\x18ParameterizedNamedStruct\x12\x14\n\x05names\x18\x01 \x03(\tR\x05names\x12M\n\x06struct\x18\x02 \x01(\x0b25.substrait.ibis.ParameterizedType.ParameterizedStructR\x06struct\x1a\xbb\x01\n\x11ParameterizedList\x125\n\x04type\x18\x01 \x01(\x0b2!.substrait.ibis.ParameterizedTypeR\x04type\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xf1\x01\n\x10ParameterizedMap\x123\n\x03key\x18\x01 \x01(\x0b2!.substrait.ibis.ParameterizedTypeR\x03key\x127\n\x05value\x18\x02 \x01(\x0b2!.substrait.ibis.ParameterizedTypeR\x05value\x12+\n\x11variation_pointer\x18\x03 \x01(\rR\x10variationPointer\x12B\n\x0bnullability\x18\x04 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xae\x01\n\x18ParameterizedUserDefined\x12!\n\x0ctype_pointer\x18\x01 \x01(\rR\x0btypePointer\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x8f\x01\n\rIntegerOption\x12\x1a\n\x07literal\x18\x01 \x01(\x05H\x00R\x07literal\x12R\n\tparameter\x18\x02 \x01(\x0b22.substrait.ibis.ParameterizedType.IntegerParameterH\x00R\tparameterB\x0e\n\x0cinteger_typeB\x06\n\x04kindB5\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobufb\x06proto3')
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'substrait.ibis.parameterized_types_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-    DESCRIPTOR._options = None
-    DESCRIPTOR._serialized_options = b'\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobuf'
-    _PARAMETERIZEDTYPE.fields_by_name['user_defined_pointer']._options = None
-    _PARAMETERIZEDTYPE.fields_by_name['user_defined_pointer']._serialized_options = b'\x18\x01'
-    _PARAMETERIZEDTYPE._serialized_start = 88
-    _PARAMETERIZEDTYPE._serialized_end = 4197
-    _PARAMETERIZEDTYPE_TYPEPARAMETER._serialized_start = 1804
-    _PARAMETERIZEDTYPE_TYPEPARAMETER._serialized_end = 1898
-    _PARAMETERIZEDTYPE_INTEGERPARAMETER._serialized_start = 1901
-    _PARAMETERIZEDTYPE_INTEGERPARAMETER._serialized_end = 2141
-    _PARAMETERIZEDTYPE_NULLABLEINTEGER._serialized_start = 2143
-    _PARAMETERIZEDTYPE_NULLABLEINTEGER._serialized_end = 2182
-    _PARAMETERIZEDTYPE_PARAMETERIZEDFIXEDCHAR._serialized_start = 2185
-    _PARAMETERIZEDTYPE_PARAMETERIZEDFIXEDCHAR._serialized_end = 2395
-    _PARAMETERIZEDTYPE_PARAMETERIZEDVARCHAR._serialized_start = 2398
-    _PARAMETERIZEDTYPE_PARAMETERIZEDVARCHAR._serialized_end = 2606
-    _PARAMETERIZEDTYPE_PARAMETERIZEDFIXEDBINARY._serialized_start = 2609
-    _PARAMETERIZEDTYPE_PARAMETERIZEDFIXEDBINARY._serialized_end = 2821
-    _PARAMETERIZEDTYPE_PARAMETERIZEDDECIMAL._serialized_start = 2824
-    _PARAMETERIZEDTYPE_PARAMETERIZEDDECIMAL._serialized_end = 3109
-    _PARAMETERIZEDTYPE_PARAMETERIZEDSTRUCT._serialized_start = 3112
-    _PARAMETERIZEDTYPE_PARAMETERIZEDSTRUCT._serialized_end = 3303
-    _PARAMETERIZEDTYPE_PARAMETERIZEDNAMEDSTRUCT._serialized_start = 3305
-    _PARAMETERIZEDTYPE_PARAMETERIZEDNAMEDSTRUCT._serialized_end = 3432
-    _PARAMETERIZEDTYPE_PARAMETERIZEDLIST._serialized_start = 3435
-    _PARAMETERIZEDTYPE_PARAMETERIZEDLIST._serialized_end = 3622
-    _PARAMETERIZEDTYPE_PARAMETERIZEDMAP._serialized_start = 3625
-    _PARAMETERIZEDTYPE_PARAMETERIZEDMAP._serialized_end = 3866
-    _PARAMETERIZEDTYPE_PARAMETERIZEDUSERDEFINED._serialized_start = 3869
-    _PARAMETERIZEDTYPE_PARAMETERIZEDUSERDEFINED._serialized_end = 4043
-    _PARAMETERIZEDTYPE_INTEGEROPTION._serialized_start = 4046
-    _PARAMETERIZEDTYPE_INTEGEROPTION._serialized_end = 4189
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/ibis/parameterized_types_pb2.pyi b/ibis_substrait/proto/substrait/ibis/parameterized_types_pb2.pyi
deleted file mode 100644
index f8cc2ae8..00000000
--- a/ibis_substrait/proto/substrait/ibis/parameterized_types_pb2.pyi
+++ /dev/null
@@ -1,424 +0,0 @@
-"""
-@generated by mypy-protobuf.  Do not edit manually!
-isort:skip_file
-SPDX-License-Identifier: Apache-2.0"""
-import builtins
-import collections.abc
-import google.protobuf.descriptor
-import google.protobuf.internal.containers
-import google.protobuf.message
-from ... import substrait
-import sys
-if sys.version_info >= (3, 8):
-    import typing as typing_extensions
-else:
-    import typing_extensions
-DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
-
-class ParameterizedType(google.protobuf.message.Message):
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class TypeParameter(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        NAME_FIELD_NUMBER: builtins.int
-        BOUNDS_FIELD_NUMBER: builtins.int
-        name: builtins.str
-
-        @property
-        def bounds(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ParameterizedType]:
-            ...
-
-        def __init__(self, *, name: builtins.str=..., bounds: collections.abc.Iterable[global___ParameterizedType] | None=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['bounds', b'bounds', 'name', b'name']) -> None:
-            ...
-
-    class IntegerParameter(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        NAME_FIELD_NUMBER: builtins.int
-        RANGE_START_INCLUSIVE_FIELD_NUMBER: builtins.int
-        RANGE_END_EXCLUSIVE_FIELD_NUMBER: builtins.int
-        name: builtins.str
-
-        @property
-        def range_start_inclusive(self) -> global___ParameterizedType.NullableInteger:
-            ...
-
-        @property
-        def range_end_exclusive(self) -> global___ParameterizedType.NullableInteger:
-            ...
-
-        def __init__(self, *, name: builtins.str=..., range_start_inclusive: global___ParameterizedType.NullableInteger | None=..., range_end_exclusive: global___ParameterizedType.NullableInteger | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['range_end_exclusive', b'range_end_exclusive', 'range_start_inclusive', b'range_start_inclusive']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['name', b'name', 'range_end_exclusive', b'range_end_exclusive', 'range_start_inclusive', b'range_start_inclusive']) -> None:
-            ...
-
-    class NullableInteger(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        VALUE_FIELD_NUMBER: builtins.int
-        value: builtins.int
-
-        def __init__(self, *, value: builtins.int=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['value', b'value']) -> None:
-            ...
-
-    class ParameterizedFixedChar(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        LENGTH_FIELD_NUMBER: builtins.int
-        VARIATION_POINTER_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-
-        @property
-        def length(self) -> global___ParameterizedType.IntegerOption:
-            ...
-        variation_pointer: builtins.int
-        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
-
-        def __init__(self, *, length: global___ParameterizedType.IntegerOption | None=..., variation_pointer: builtins.int=..., nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['length', b'length']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['length', b'length', 'nullability', b'nullability', 'variation_pointer', b'variation_pointer']) -> None:
-            ...
-
-    class ParameterizedVarChar(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        LENGTH_FIELD_NUMBER: builtins.int
-        VARIATION_POINTER_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-
-        @property
-        def length(self) -> global___ParameterizedType.IntegerOption:
-            ...
-        variation_pointer: builtins.int
-        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
-
-        def __init__(self, *, length: global___ParameterizedType.IntegerOption | None=..., variation_pointer: builtins.int=..., nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['length', b'length']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['length', b'length', 'nullability', b'nullability', 'variation_pointer', b'variation_pointer']) -> None:
-            ...
-
-    class ParameterizedFixedBinary(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        LENGTH_FIELD_NUMBER: builtins.int
-        VARIATION_POINTER_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-
-        @property
-        def length(self) -> global___ParameterizedType.IntegerOption:
-            ...
-        variation_pointer: builtins.int
-        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
-
-        def __init__(self, *, length: global___ParameterizedType.IntegerOption | None=..., variation_pointer: builtins.int=..., nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['length', b'length']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['length', b'length', 'nullability', b'nullability', 'variation_pointer', b'variation_pointer']) -> None:
-            ...
-
-    class ParameterizedDecimal(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        SCALE_FIELD_NUMBER: builtins.int
-        PRECISION_FIELD_NUMBER: builtins.int
-        VARIATION_POINTER_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-
-        @property
-        def scale(self) -> global___ParameterizedType.IntegerOption:
-            ...
-
-        @property
-        def precision(self) -> global___ParameterizedType.IntegerOption:
-            ...
-        variation_pointer: builtins.int
-        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
-
-        def __init__(self, *, scale: global___ParameterizedType.IntegerOption | None=..., precision: global___ParameterizedType.IntegerOption | None=..., variation_pointer: builtins.int=..., nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['precision', b'precision', 'scale', b'scale']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'precision', b'precision', 'scale', b'scale', 'variation_pointer', b'variation_pointer']) -> None:
-            ...
-
-    class ParameterizedStruct(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPES_FIELD_NUMBER: builtins.int
-        VARIATION_POINTER_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-
-        @property
-        def types(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ParameterizedType]:
-            ...
-        variation_pointer: builtins.int
-        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
-
-        def __init__(self, *, types: collections.abc.Iterable[global___ParameterizedType] | None=..., variation_pointer: builtins.int=..., nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'types', b'types', 'variation_pointer', b'variation_pointer']) -> None:
-            ...
-
-    class ParameterizedNamedStruct(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        NAMES_FIELD_NUMBER: builtins.int
-        STRUCT_FIELD_NUMBER: builtins.int
-
-        @property
-        def names(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-            """list of names in dfs order"""
-
-        @property
-        def struct(self) -> global___ParameterizedType.ParameterizedStruct:
-            ...
-
-        def __init__(self, *, names: collections.abc.Iterable[builtins.str] | None=..., struct: global___ParameterizedType.ParameterizedStruct | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['struct', b'struct']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['names', b'names', 'struct', b'struct']) -> None:
-            ...
-
-    class ParameterizedList(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_FIELD_NUMBER: builtins.int
-        VARIATION_POINTER_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-
-        @property
-        def type(self) -> global___ParameterizedType:
-            ...
-        variation_pointer: builtins.int
-        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
-
-        def __init__(self, *, type: global___ParameterizedType | None=..., variation_pointer: builtins.int=..., nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['type', b'type']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type', b'type', 'variation_pointer', b'variation_pointer']) -> None:
-            ...
-
-    class ParameterizedMap(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        KEY_FIELD_NUMBER: builtins.int
-        VALUE_FIELD_NUMBER: builtins.int
-        VARIATION_POINTER_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-
-        @property
-        def key(self) -> global___ParameterizedType:
-            ...
-
-        @property
-        def value(self) -> global___ParameterizedType:
-            ...
-        variation_pointer: builtins.int
-        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
-
-        def __init__(self, *, key: global___ParameterizedType | None=..., value: global___ParameterizedType | None=..., variation_pointer: builtins.int=..., nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['key', b'key', 'value', b'value']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['key', b'key', 'nullability', b'nullability', 'value', b'value', 'variation_pointer', b'variation_pointer']) -> None:
-            ...
-
-    class ParameterizedUserDefined(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_POINTER_FIELD_NUMBER: builtins.int
-        VARIATION_POINTER_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_pointer: builtins.int
-        variation_pointer: builtins.int
-        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
-
-        def __init__(self, *, type_pointer: builtins.int=..., variation_pointer: builtins.int=..., nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_pointer', b'type_pointer', 'variation_pointer', b'variation_pointer']) -> None:
-            ...
-
-    class IntegerOption(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        LITERAL_FIELD_NUMBER: builtins.int
-        PARAMETER_FIELD_NUMBER: builtins.int
-        literal: builtins.int
-
-        @property
-        def parameter(self) -> global___ParameterizedType.IntegerParameter:
-            ...
-
-        def __init__(self, *, literal: builtins.int=..., parameter: global___ParameterizedType.IntegerParameter | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['integer_type', b'integer_type', 'literal', b'literal', 'parameter', b'parameter']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['integer_type', b'integer_type', 'literal', b'literal', 'parameter', b'parameter']) -> None:
-            ...
-
-        def WhichOneof(self, oneof_group: typing_extensions.Literal['integer_type', b'integer_type']) -> typing_extensions.Literal['literal', 'parameter'] | None:
-            ...
-    BOOL_FIELD_NUMBER: builtins.int
-    I8_FIELD_NUMBER: builtins.int
-    I16_FIELD_NUMBER: builtins.int
-    I32_FIELD_NUMBER: builtins.int
-    I64_FIELD_NUMBER: builtins.int
-    FP32_FIELD_NUMBER: builtins.int
-    FP64_FIELD_NUMBER: builtins.int
-    STRING_FIELD_NUMBER: builtins.int
-    BINARY_FIELD_NUMBER: builtins.int
-    TIMESTAMP_FIELD_NUMBER: builtins.int
-    DATE_FIELD_NUMBER: builtins.int
-    TIME_FIELD_NUMBER: builtins.int
-    INTERVAL_YEAR_FIELD_NUMBER: builtins.int
-    INTERVAL_DAY_FIELD_NUMBER: builtins.int
-    TIMESTAMP_TZ_FIELD_NUMBER: builtins.int
-    UUID_FIELD_NUMBER: builtins.int
-    FIXED_CHAR_FIELD_NUMBER: builtins.int
-    VARCHAR_FIELD_NUMBER: builtins.int
-    FIXED_BINARY_FIELD_NUMBER: builtins.int
-    DECIMAL_FIELD_NUMBER: builtins.int
-    STRUCT_FIELD_NUMBER: builtins.int
-    LIST_FIELD_NUMBER: builtins.int
-    MAP_FIELD_NUMBER: builtins.int
-    USER_DEFINED_FIELD_NUMBER: builtins.int
-    USER_DEFINED_POINTER_FIELD_NUMBER: builtins.int
-    TYPE_PARAMETER_FIELD_NUMBER: builtins.int
-
-    @property
-    def bool(self) -> substrait.ibis.type_pb2.Type.Boolean:
-        ...
-
-    @property
-    def i8(self) -> substrait.ibis.type_pb2.Type.I8:
-        ...
-
-    @property
-    def i16(self) -> substrait.ibis.type_pb2.Type.I16:
-        ...
-
-    @property
-    def i32(self) -> substrait.ibis.type_pb2.Type.I32:
-        ...
-
-    @property
-    def i64(self) -> substrait.ibis.type_pb2.Type.I64:
-        ...
-
-    @property
-    def fp32(self) -> substrait.ibis.type_pb2.Type.FP32:
-        ...
-
-    @property
-    def fp64(self) -> substrait.ibis.type_pb2.Type.FP64:
-        ...
-
-    @property
-    def string(self) -> substrait.ibis.type_pb2.Type.String:
-        ...
-
-    @property
-    def binary(self) -> substrait.ibis.type_pb2.Type.Binary:
-        ...
-
-    @property
-    def timestamp(self) -> substrait.ibis.type_pb2.Type.Timestamp:
-        ...
-
-    @property
-    def date(self) -> substrait.ibis.type_pb2.Type.Date:
-        ...
-
-    @property
-    def time(self) -> substrait.ibis.type_pb2.Type.Time:
-        ...
-
-    @property
-    def interval_year(self) -> substrait.ibis.type_pb2.Type.IntervalYear:
-        ...
-
-    @property
-    def interval_day(self) -> substrait.ibis.type_pb2.Type.IntervalDay:
-        ...
-
-    @property
-    def timestamp_tz(self) -> substrait.ibis.type_pb2.Type.TimestampTZ:
-        ...
-
-    @property
-    def uuid(self) -> substrait.ibis.type_pb2.Type.UUID:
-        ...
-
-    @property
-    def fixed_char(self) -> global___ParameterizedType.ParameterizedFixedChar:
-        ...
-
-    @property
-    def varchar(self) -> global___ParameterizedType.ParameterizedVarChar:
-        ...
-
-    @property
-    def fixed_binary(self) -> global___ParameterizedType.ParameterizedFixedBinary:
-        ...
-
-    @property
-    def decimal(self) -> global___ParameterizedType.ParameterizedDecimal:
-        ...
-
-    @property
-    def struct(self) -> global___ParameterizedType.ParameterizedStruct:
-        ...
-
-    @property
-    def list(self) -> global___ParameterizedType.ParameterizedList:
-        ...
-
-    @property
-    def map(self) -> global___ParameterizedType.ParameterizedMap:
-        ...
-
-    @property
-    def user_defined(self) -> global___ParameterizedType.ParameterizedUserDefined:
-        ...
-    user_defined_pointer: builtins.int
-    'Deprecated in favor of user_defined, which allows nullability and\n    variations to be specified. If user_defined_pointer is encountered,\n    treat it as being non-nullable and having the default variation.\n    '
-
-    @property
-    def type_parameter(self) -> global___ParameterizedType.TypeParameter:
-        ...
-
-    def __init__(self, *, bool: substrait.ibis.type_pb2.Type.Boolean | None=..., i8: substrait.ibis.type_pb2.Type.I8 | None=..., i16: substrait.ibis.type_pb2.Type.I16 | None=..., i32: substrait.ibis.type_pb2.Type.I32 | None=..., i64: substrait.ibis.type_pb2.Type.I64 | None=..., fp32: substrait.ibis.type_pb2.Type.FP32 | None=..., fp64: substrait.ibis.type_pb2.Type.FP64 | None=..., string: substrait.ibis.type_pb2.Type.String | None=..., binary: substrait.ibis.type_pb2.Type.Binary | None=..., timestamp: substrait.ibis.type_pb2.Type.Timestamp | None=..., date: substrait.ibis.type_pb2.Type.Date | None=..., time: substrait.ibis.type_pb2.Type.Time | None=..., interval_year: substrait.ibis.type_pb2.Type.IntervalYear | None=..., interval_day: substrait.ibis.type_pb2.Type.IntervalDay | None=..., timestamp_tz: substrait.ibis.type_pb2.Type.TimestampTZ | None=..., uuid: substrait.ibis.type_pb2.Type.UUID | None=..., fixed_char: global___ParameterizedType.ParameterizedFixedChar | None=..., varchar: global___ParameterizedType.ParameterizedVarChar | None=..., fixed_binary: global___ParameterizedType.ParameterizedFixedBinary | None=..., decimal: global___ParameterizedType.ParameterizedDecimal | None=..., struct: global___ParameterizedType.ParameterizedStruct | None=..., list: global___ParameterizedType.ParameterizedList | None=..., map: global___ParameterizedType.ParameterizedMap | None=..., user_defined: global___ParameterizedType.ParameterizedUserDefined | None=..., user_defined_pointer: builtins.int=..., type_parameter: global___ParameterizedType.TypeParameter | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['binary', b'binary', 'bool', b'bool', 'date', b'date', 'decimal', b'decimal', 'fixed_binary', b'fixed_binary', 'fixed_char', b'fixed_char', 'fp32', b'fp32', 'fp64', b'fp64', 'i16', b'i16', 'i32', b'i32', 'i64', b'i64', 'i8', b'i8', 'interval_day', b'interval_day', 'interval_year', b'interval_year', 'kind', b'kind', 'list', b'list', 'map', b'map', 'string', b'string', 'struct', b'struct', 'time', b'time', 'timestamp', b'timestamp', 'timestamp_tz', b'timestamp_tz', 'type_parameter', b'type_parameter', 'user_defined', b'user_defined', 'user_defined_pointer', b'user_defined_pointer', 'uuid', b'uuid', 'varchar', b'varchar']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['binary', b'binary', 'bool', b'bool', 'date', b'date', 'decimal', b'decimal', 'fixed_binary', b'fixed_binary', 'fixed_char', b'fixed_char', 'fp32', b'fp32', 'fp64', b'fp64', 'i16', b'i16', 'i32', b'i32', 'i64', b'i64', 'i8', b'i8', 'interval_day', b'interval_day', 'interval_year', b'interval_year', 'kind', b'kind', 'list', b'list', 'map', b'map', 'string', b'string', 'struct', b'struct', 'time', b'time', 'timestamp', b'timestamp', 'timestamp_tz', b'timestamp_tz', 'type_parameter', b'type_parameter', 'user_defined', b'user_defined', 'user_defined_pointer', b'user_defined_pointer', 'uuid', b'uuid', 'varchar', b'varchar']) -> None:
-        ...
-
-    def WhichOneof(self, oneof_group: typing_extensions.Literal['kind', b'kind']) -> typing_extensions.Literal['bool', 'i8', 'i16', 'i32', 'i64', 'fp32', 'fp64', 'string', 'binary', 'timestamp', 'date', 'time', 'interval_year', 'interval_day', 'timestamp_tz', 'uuid', 'fixed_char', 'varchar', 'fixed_binary', 'decimal', 'struct', 'list', 'map', 'user_defined', 'user_defined_pointer', 'type_parameter'] | None:
-        ...
-global___ParameterizedType = ParameterizedType
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/ibis/plan_pb2.py b/ibis_substrait/proto/substrait/ibis/plan_pb2.py
deleted file mode 100644
index fd7c2034..00000000
--- a/ibis_substrait/proto/substrait/ibis/plan_pb2.py
+++ /dev/null
@@ -1,22 +0,0 @@
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-_sym_db = _symbol_database.Default()
-from ...substrait.ibis import algebra_pb2 as substrait_dot_ibis_dot_algebra__pb2
-from ...substrait.ibis.extensions import extensions_pb2 as substrait_dot_ibis_dot_extensions_dot_extensions__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19substrait/ibis/plan.proto\x12\x0esubstrait.ibis\x1a\x1csubstrait/ibis/algebra.proto\x1a*substrait/ibis/extensions/extensions.proto"m\n\x07PlanRel\x12\'\n\x03rel\x18\x01 \x01(\x0b2\x13.substrait.ibis.RelH\x00R\x03rel\x12-\n\x04root\x18\x02 \x01(\x0b2\x17.substrait.ibis.RelRootH\x00R\x04rootB\n\n\x08rel_type"\xaa\x03\n\x04Plan\x121\n\x07version\x18\x06 \x01(\x0b2\x17.substrait.ibis.VersionR\x07version\x12T\n\x0eextension_uris\x18\x01 \x03(\x0b2-.substrait.ibis.extensions.SimpleExtensionURIR\rextensionUris\x12U\n\nextensions\x18\x02 \x03(\x0b25.substrait.ibis.extensions.SimpleExtensionDeclarationR\nextensions\x125\n\trelations\x18\x03 \x03(\x0b2\x17.substrait.ibis.PlanRelR\trelations\x12]\n\x13advanced_extensions\x18\x04 \x01(\x0b2,.substrait.ibis.extensions.AdvancedExtensionR\x12advancedExtensions\x12,\n\x12expected_type_urls\x18\x05 \x03(\tR\x10expectedTypeUrls"@\n\x0bPlanVersion\x121\n\x07version\x18\x06 \x01(\x0b2\x17.substrait.ibis.VersionR\x07version"\xa9\x01\n\x07Version\x12!\n\x0cmajor_number\x18\x01 \x01(\rR\x0bmajorNumber\x12!\n\x0cminor_number\x18\x02 \x01(\rR\x0bminorNumber\x12!\n\x0cpatch_number\x18\x03 \x01(\rR\x0bpatchNumber\x12\x19\n\x08git_hash\x18\x04 \x01(\tR\x07gitHash\x12\x1a\n\x08producer\x18\x05 \x01(\tR\x08producerB5\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobufb\x06proto3')
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'substrait.ibis.plan_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-    DESCRIPTOR._options = None
-    DESCRIPTOR._serialized_options = b'\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobuf'
-    _PLANREL._serialized_start = 119
-    _PLANREL._serialized_end = 228
-    _PLAN._serialized_start = 231
-    _PLAN._serialized_end = 657
-    _PLANVERSION._serialized_start = 659
-    _PLANVERSION._serialized_end = 723
-    _VERSION._serialized_start = 726
-    _VERSION._serialized_end = 895
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/ibis/plan_pb2.pyi b/ibis_substrait/proto/substrait/ibis/plan_pb2.pyi
deleted file mode 100644
index d1b2d11e..00000000
--- a/ibis_substrait/proto/substrait/ibis/plan_pb2.pyi
+++ /dev/null
@@ -1,143 +0,0 @@
-"""
-@generated by mypy-protobuf.  Do not edit manually!
-isort:skip_file
-SPDX-License-Identifier: Apache-2.0"""
-import builtins
-import collections.abc
-import google.protobuf.descriptor
-import google.protobuf.internal.containers
-import google.protobuf.message
-from ... import substrait
-import sys
-if sys.version_info >= (3, 8):
-    import typing as typing_extensions
-else:
-    import typing_extensions
-DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
-
-class PlanRel(google.protobuf.message.Message):
-    """Either a relation or root relation"""
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    REL_FIELD_NUMBER: builtins.int
-    ROOT_FIELD_NUMBER: builtins.int
-
-    @property
-    def rel(self) -> substrait.ibis.algebra_pb2.Rel:
-        """Any relation (used for references and CTEs)"""
-
-    @property
-    def root(self) -> substrait.ibis.algebra_pb2.RelRoot:
-        """The root of a relation tree"""
-
-    def __init__(self, *, rel: substrait.ibis.algebra_pb2.Rel | None=..., root: substrait.ibis.algebra_pb2.RelRoot | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['rel', b'rel', 'rel_type', b'rel_type', 'root', b'root']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['rel', b'rel', 'rel_type', b'rel_type', 'root', b'root']) -> None:
-        ...
-
-    def WhichOneof(self, oneof_group: typing_extensions.Literal['rel_type', b'rel_type']) -> typing_extensions.Literal['rel', 'root'] | None:
-        ...
-global___PlanRel = PlanRel
-
-class Plan(google.protobuf.message.Message):
-    """Describe a set of operations to complete.
-    For compactness sake, identifiers are normalized at the plan level.
-    """
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    VERSION_FIELD_NUMBER: builtins.int
-    EXTENSION_URIS_FIELD_NUMBER: builtins.int
-    EXTENSIONS_FIELD_NUMBER: builtins.int
-    RELATIONS_FIELD_NUMBER: builtins.int
-    ADVANCED_EXTENSIONS_FIELD_NUMBER: builtins.int
-    EXPECTED_TYPE_URLS_FIELD_NUMBER: builtins.int
-
-    @property
-    def version(self) -> global___Version:
-        """Substrait version of the plan. Optional up to 0.17.0, required for later
-        versions.
-        """
-
-    @property
-    def extension_uris(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[substrait.ibis.extensions.extensions_pb2.SimpleExtensionURI]:
-        """a list of yaml specifications this plan may depend on"""
-
-    @property
-    def extensions(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[substrait.ibis.extensions.extensions_pb2.SimpleExtensionDeclaration]:
-        """a list of extensions this plan may depend on"""
-
-    @property
-    def relations(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___PlanRel]:
-        """one or more relation trees that are associated with this plan."""
-
-    @property
-    def advanced_extensions(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
-        """additional extensions associated with this plan."""
-
-    @property
-    def expected_type_urls(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-        """A list of com.google.Any entities that this plan may use. Can be used to
-        warn if some embedded message types are unknown. Note that this list may
-        include message types that are ignorable (optimizations) or that are
-        unused. In many cases, a consumer may be able to work with a plan even if
-        one or more message types defined here are unknown.
-        """
-
-    def __init__(self, *, version: global___Version | None=..., extension_uris: collections.abc.Iterable[substrait.ibis.extensions.extensions_pb2.SimpleExtensionURI] | None=..., extensions: collections.abc.Iterable[substrait.ibis.extensions.extensions_pb2.SimpleExtensionDeclaration] | None=..., relations: collections.abc.Iterable[global___PlanRel] | None=..., advanced_extensions: substrait.ibis.extensions.extensions_pb2.AdvancedExtension | None=..., expected_type_urls: collections.abc.Iterable[builtins.str] | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['advanced_extensions', b'advanced_extensions', 'version', b'version']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['advanced_extensions', b'advanced_extensions', 'expected_type_urls', b'expected_type_urls', 'extension_uris', b'extension_uris', 'extensions', b'extensions', 'relations', b'relations', 'version', b'version']) -> None:
-        ...
-global___Plan = Plan
-
-class PlanVersion(google.protobuf.message.Message):
-    """This message type can be used to deserialize only the version of a Substrait
-    Plan message. This prevents deserialization errors when there were breaking
-    changes between the Substrait version of the tool that produced the plan and
-    the Substrait version used to deserialize it, such that a consumer can emit
-    a more helpful error message in this case.
-    """
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    VERSION_FIELD_NUMBER: builtins.int
-
-    @property
-    def version(self) -> global___Version:
-        ...
-
-    def __init__(self, *, version: global___Version | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['version', b'version']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['version', b'version']) -> None:
-        ...
-global___PlanVersion = PlanVersion
-
-class Version(google.protobuf.message.Message):
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    MAJOR_NUMBER_FIELD_NUMBER: builtins.int
-    MINOR_NUMBER_FIELD_NUMBER: builtins.int
-    PATCH_NUMBER_FIELD_NUMBER: builtins.int
-    GIT_HASH_FIELD_NUMBER: builtins.int
-    PRODUCER_FIELD_NUMBER: builtins.int
-    major_number: builtins.int
-    'Substrait version number.'
-    minor_number: builtins.int
-    patch_number: builtins.int
-    git_hash: builtins.str
-    'If a particular version of Substrait is used that does not correspond to\n    a version number exactly (for example when using an unofficial fork or\n    using a version that is not yet released or is between versions), set this\n    to the full git hash of the utilized commit of\n    https://github.com/substrait-io/substrait (or fork thereof), represented\n    using a lowercase hex ASCII string 40 characters in length. The version\n    number above should be set to the most recent version tag in the history\n    of that commit.\n    '
-    producer: builtins.str
-    'Identifying information for the producer that created this plan. Under\n    ideal circumstances, consumers should not need this information. However,\n    it is foreseen that consumers may need to work around bugs in particular\n    producers in practice, and therefore may need to know which producer\n    created the plan.\n    '
-
-    def __init__(self, *, major_number: builtins.int=..., minor_number: builtins.int=..., patch_number: builtins.int=..., git_hash: builtins.str=..., producer: builtins.str=...) -> None:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['git_hash', b'git_hash', 'major_number', b'major_number', 'minor_number', b'minor_number', 'patch_number', b'patch_number', 'producer', b'producer']) -> None:
-        ...
-global___Version = Version
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/ibis/type_expressions_pb2.py b/ibis_substrait/proto/substrait/ibis/type_expressions_pb2.py
deleted file mode 100644
index a02711e3..00000000
--- a/ibis_substrait/proto/substrait/ibis/type_expressions_pb2.py
+++ /dev/null
@@ -1,49 +0,0 @@
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-_sym_db = _symbol_database.Default()
-from ...substrait.ibis import type_pb2 as substrait_dot_ibis_dot_type__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%substrait/ibis/type_expressions.proto\x12\x0esubstrait.ibis\x1a\x19substrait/ibis/type.proto"\xe9(\n\x14DerivationExpression\x122\n\x04bool\x18\x01 \x01(\x0b2\x1c.substrait.ibis.Type.BooleanH\x00R\x04bool\x12)\n\x02i8\x18\x02 \x01(\x0b2\x17.substrait.ibis.Type.I8H\x00R\x02i8\x12,\n\x03i16\x18\x03 \x01(\x0b2\x18.substrait.ibis.Type.I16H\x00R\x03i16\x12,\n\x03i32\x18\x05 \x01(\x0b2\x18.substrait.ibis.Type.I32H\x00R\x03i32\x12,\n\x03i64\x18\x07 \x01(\x0b2\x18.substrait.ibis.Type.I64H\x00R\x03i64\x12/\n\x04fp32\x18\n \x01(\x0b2\x19.substrait.ibis.Type.FP32H\x00R\x04fp32\x12/\n\x04fp64\x18\x0b \x01(\x0b2\x19.substrait.ibis.Type.FP64H\x00R\x04fp64\x125\n\x06string\x18\x0c \x01(\x0b2\x1b.substrait.ibis.Type.StringH\x00R\x06string\x125\n\x06binary\x18\r \x01(\x0b2\x1b.substrait.ibis.Type.BinaryH\x00R\x06binary\x12>\n\ttimestamp\x18\x0e \x01(\x0b2\x1e.substrait.ibis.Type.TimestampH\x00R\ttimestamp\x12/\n\x04date\x18\x10 \x01(\x0b2\x19.substrait.ibis.Type.DateH\x00R\x04date\x12/\n\x04time\x18\x11 \x01(\x0b2\x19.substrait.ibis.Type.TimeH\x00R\x04time\x12H\n\rinterval_year\x18\x13 \x01(\x0b2!.substrait.ibis.Type.IntervalYearH\x00R\x0cintervalYear\x12E\n\x0cinterval_day\x18\x14 \x01(\x0b2 .substrait.ibis.Type.IntervalDayH\x00R\x0bintervalDay\x12E\n\x0ctimestamp_tz\x18\x1d \x01(\x0b2 .substrait.ibis.Type.TimestampTZH\x00R\x0btimestampTz\x12/\n\x04uuid\x18  \x01(\x0b2\x19.substrait.ibis.Type.UUIDH\x00R\x04uuid\x12Y\n\nfixed_char\x18\x15 \x01(\x0b28.substrait.ibis.DerivationExpression.ExpressionFixedCharH\x00R\tfixedChar\x12R\n\x07varchar\x18\x16 \x01(\x0b26.substrait.ibis.DerivationExpression.ExpressionVarCharH\x00R\x07varchar\x12_\n\x0cfixed_binary\x18\x17 \x01(\x0b2:.substrait.ibis.DerivationExpression.ExpressionFixedBinaryH\x00R\x0bfixedBinary\x12R\n\x07decimal\x18\x18 \x01(\x0b26.substrait.ibis.DerivationExpression.ExpressionDecimalH\x00R\x07decimal\x12O\n\x06struct\x18\x19 \x01(\x0b25.substrait.ibis.DerivationExpression.ExpressionStructH\x00R\x06struct\x12I\n\x04list\x18\x1b \x01(\x0b23.substrait.ibis.DerivationExpression.ExpressionListH\x00R\x04list\x12F\n\x03map\x18\x1c \x01(\x0b22.substrait.ibis.DerivationExpression.ExpressionMapH\x00R\x03map\x12_\n\x0cuser_defined\x18\x1e \x01(\x0b2:.substrait.ibis.DerivationExpression.ExpressionUserDefinedH\x00R\x0buserDefined\x126\n\x14user_defined_pointer\x18\x1f \x01(\rB\x02\x18\x01H\x00R\x12userDefinedPointer\x120\n\x13type_parameter_name\x18! \x01(\tH\x00R\x11typeParameterName\x126\n\x16integer_parameter_name\x18" \x01(\tH\x00R\x14integerParameterName\x12)\n\x0finteger_literal\x18# \x01(\x05H\x00R\x0eintegerLiteral\x12I\n\x08unary_op\x18$ \x01(\x0b2,.substrait.ibis.DerivationExpression.UnaryOpH\x00R\x07unaryOp\x12L\n\tbinary_op\x18% \x01(\x0b2-.substrait.ibis.DerivationExpression.BinaryOpH\x00R\x08binaryOp\x12F\n\x07if_else\x18& \x01(\x0b2+.substrait.ibis.DerivationExpression.IfElseH\x00R\x06ifElse\x12[\n\x0ereturn_program\x18\' \x01(\x0b22.substrait.ibis.DerivationExpression.ReturnProgramH\x00R\rreturnProgram\x1a\xc4\x01\n\x13ExpressionFixedChar\x12<\n\x06length\x18\x01 \x01(\x0b2$.substrait.ibis.DerivationExpressionR\x06length\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xc2\x01\n\x11ExpressionVarChar\x12<\n\x06length\x18\x01 \x01(\x0b2$.substrait.ibis.DerivationExpressionR\x06length\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xc6\x01\n\x15ExpressionFixedBinary\x12<\n\x06length\x18\x01 \x01(\x0b2$.substrait.ibis.DerivationExpressionR\x06length\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x84\x02\n\x11ExpressionDecimal\x12:\n\x05scale\x18\x01 \x01(\x0b2$.substrait.ibis.DerivationExpressionR\x05scale\x12B\n\tprecision\x18\x02 \x01(\x0b2$.substrait.ibis.DerivationExpressionR\tprecision\x12+\n\x11variation_pointer\x18\x03 \x01(\rR\x10variationPointer\x12B\n\x0bnullability\x18\x04 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xbf\x01\n\x10ExpressionStruct\x12:\n\x05types\x18\x01 \x03(\x0b2$.substrait.ibis.DerivationExpressionR\x05types\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a|\n\x15ExpressionNamedStruct\x12\x14\n\x05names\x18\x01 \x03(\tR\x05names\x12M\n\x06struct\x18\x02 \x01(\x0b25.substrait.ibis.DerivationExpression.ExpressionStructR\x06struct\x1a\xbb\x01\n\x0eExpressionList\x128\n\x04type\x18\x01 \x01(\x0b2$.substrait.ibis.DerivationExpressionR\x04type\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xf4\x01\n\rExpressionMap\x126\n\x03key\x18\x01 \x01(\x0b2$.substrait.ibis.DerivationExpressionR\x03key\x12:\n\x05value\x18\x02 \x01(\x0b2$.substrait.ibis.DerivationExpressionR\x05value\x12+\n\x11variation_pointer\x18\x03 \x01(\rR\x10variationPointer\x12B\n\x0bnullability\x18\x04 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xab\x01\n\x15ExpressionUserDefined\x12!\n\x0ctype_pointer\x18\x01 \x01(\rR\x0btypePointer\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xdb\x01\n\x06IfElse\x12G\n\x0cif_condition\x18\x01 \x01(\x0b2$.substrait.ibis.DerivationExpressionR\x0bifCondition\x12A\n\tif_return\x18\x02 \x01(\x0b2$.substrait.ibis.DerivationExpressionR\x08ifReturn\x12E\n\x0belse_return\x18\x03 \x01(\x0b2$.substrait.ibis.DerivationExpressionR\nelseReturn\x1a\xe1\x01\n\x07UnaryOp\x12Q\n\x07op_type\x18\x01 \x01(\x0e28.substrait.ibis.DerivationExpression.UnaryOp.UnaryOpTypeR\x06opType\x126\n\x03arg\x18\x02 \x01(\x0b2$.substrait.ibis.DerivationExpressionR\x03arg"K\n\x0bUnaryOpType\x12\x1d\n\x19UNARY_OP_TYPE_UNSPECIFIED\x10\x00\x12\x1d\n\x19UNARY_OP_TYPE_BOOLEAN_NOT\x10\x01\x1a\xc3\x04\n\x08BinaryOp\x12S\n\x07op_type\x18\x01 \x01(\x0e2:.substrait.ibis.DerivationExpression.BinaryOp.BinaryOpTypeR\x06opType\x128\n\x04arg1\x18\x02 \x01(\x0b2$.substrait.ibis.DerivationExpressionR\x04arg1\x128\n\x04arg2\x18\x03 \x01(\x0b2$.substrait.ibis.DerivationExpressionR\x04arg2"\xed\x02\n\x0cBinaryOpType\x12\x1e\n\x1aBINARY_OP_TYPE_UNSPECIFIED\x10\x00\x12\x17\n\x13BINARY_OP_TYPE_PLUS\x10\x01\x12\x18\n\x14BINARY_OP_TYPE_MINUS\x10\x02\x12\x1b\n\x17BINARY_OP_TYPE_MULTIPLY\x10\x03\x12\x19\n\x15BINARY_OP_TYPE_DIVIDE\x10\x04\x12\x16\n\x12BINARY_OP_TYPE_MIN\x10\x05\x12\x16\n\x12BINARY_OP_TYPE_MAX\x10\x06\x12\x1f\n\x1bBINARY_OP_TYPE_GREATER_THAN\x10\x07\x12\x1c\n\x18BINARY_OP_TYPE_LESS_THAN\x10\x08\x12\x16\n\x12BINARY_OP_TYPE_AND\x10\t\x12\x15\n\x11BINARY_OP_TYPE_OR\x10\n\x12\x19\n\x15BINARY_OP_TYPE_EQUALS\x10\x0b\x12\x19\n\x15BINARY_OP_TYPE_COVERS\x10\x0c\x1a\xa9\x02\n\rReturnProgram\x12_\n\x0bassignments\x18\x01 \x03(\x0b2=.substrait.ibis.DerivationExpression.ReturnProgram.AssignmentR\x0bassignments\x12O\n\x10final_expression\x18\x02 \x01(\x0b2$.substrait.ibis.DerivationExpressionR\x0ffinalExpression\x1af\n\nAssignment\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12D\n\nexpression\x18\x02 \x01(\x0b2$.substrait.ibis.DerivationExpressionR\nexpressionB\x06\n\x04kindB5\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobufb\x06proto3')
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'substrait.ibis.type_expressions_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-    DESCRIPTOR._options = None
-    DESCRIPTOR._serialized_options = b'\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobuf'
-    _DERIVATIONEXPRESSION.fields_by_name['user_defined_pointer']._options = None
-    _DERIVATIONEXPRESSION.fields_by_name['user_defined_pointer']._serialized_options = b'\x18\x01'
-    _DERIVATIONEXPRESSION._serialized_start = 85
-    _DERIVATIONEXPRESSION._serialized_end = 5310
-    _DERIVATIONEXPRESSION_EXPRESSIONFIXEDCHAR._serialized_start = 2182
-    _DERIVATIONEXPRESSION_EXPRESSIONFIXEDCHAR._serialized_end = 2378
-    _DERIVATIONEXPRESSION_EXPRESSIONVARCHAR._serialized_start = 2381
-    _DERIVATIONEXPRESSION_EXPRESSIONVARCHAR._serialized_end = 2575
-    _DERIVATIONEXPRESSION_EXPRESSIONFIXEDBINARY._serialized_start = 2578
-    _DERIVATIONEXPRESSION_EXPRESSIONFIXEDBINARY._serialized_end = 2776
-    _DERIVATIONEXPRESSION_EXPRESSIONDECIMAL._serialized_start = 2779
-    _DERIVATIONEXPRESSION_EXPRESSIONDECIMAL._serialized_end = 3039
-    _DERIVATIONEXPRESSION_EXPRESSIONSTRUCT._serialized_start = 3042
-    _DERIVATIONEXPRESSION_EXPRESSIONSTRUCT._serialized_end = 3233
-    _DERIVATIONEXPRESSION_EXPRESSIONNAMEDSTRUCT._serialized_start = 3235
-    _DERIVATIONEXPRESSION_EXPRESSIONNAMEDSTRUCT._serialized_end = 3359
-    _DERIVATIONEXPRESSION_EXPRESSIONLIST._serialized_start = 3362
-    _DERIVATIONEXPRESSION_EXPRESSIONLIST._serialized_end = 3549
-    _DERIVATIONEXPRESSION_EXPRESSIONMAP._serialized_start = 3552
-    _DERIVATIONEXPRESSION_EXPRESSIONMAP._serialized_end = 3796
-    _DERIVATIONEXPRESSION_EXPRESSIONUSERDEFINED._serialized_start = 3799
-    _DERIVATIONEXPRESSION_EXPRESSIONUSERDEFINED._serialized_end = 3970
-    _DERIVATIONEXPRESSION_IFELSE._serialized_start = 3973
-    _DERIVATIONEXPRESSION_IFELSE._serialized_end = 4192
-    _DERIVATIONEXPRESSION_UNARYOP._serialized_start = 4195
-    _DERIVATIONEXPRESSION_UNARYOP._serialized_end = 4420
-    _DERIVATIONEXPRESSION_UNARYOP_UNARYOPTYPE._serialized_start = 4345
-    _DERIVATIONEXPRESSION_UNARYOP_UNARYOPTYPE._serialized_end = 4420
-    _DERIVATIONEXPRESSION_BINARYOP._serialized_start = 4423
-    _DERIVATIONEXPRESSION_BINARYOP._serialized_end = 5002
-    _DERIVATIONEXPRESSION_BINARYOP_BINARYOPTYPE._serialized_start = 4637
-    _DERIVATIONEXPRESSION_BINARYOP_BINARYOPTYPE._serialized_end = 5002
-    _DERIVATIONEXPRESSION_RETURNPROGRAM._serialized_start = 5005
-    _DERIVATIONEXPRESSION_RETURNPROGRAM._serialized_end = 5302
-    _DERIVATIONEXPRESSION_RETURNPROGRAM_ASSIGNMENT._serialized_start = 5200
-    _DERIVATIONEXPRESSION_RETURNPROGRAM_ASSIGNMENT._serialized_end = 5302
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/ibis/type_expressions_pb2.pyi b/ibis_substrait/proto/substrait/ibis/type_expressions_pb2.pyi
deleted file mode 100644
index b3418925..00000000
--- a/ibis_substrait/proto/substrait/ibis/type_expressions_pb2.pyi
+++ /dev/null
@@ -1,535 +0,0 @@
-"""
-@generated by mypy-protobuf.  Do not edit manually!
-isort:skip_file
-SPDX-License-Identifier: Apache-2.0"""
-import builtins
-import collections.abc
-import google.protobuf.descriptor
-import google.protobuf.internal.containers
-import google.protobuf.internal.enum_type_wrapper
-import google.protobuf.message
-from ... import substrait
-import sys
-import typing
-if sys.version_info >= (3, 10):
-    import typing as typing_extensions
-else:
-    import typing_extensions
-DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
-
-class DerivationExpression(google.protobuf.message.Message):
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class ExpressionFixedChar(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        LENGTH_FIELD_NUMBER: builtins.int
-        VARIATION_POINTER_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-
-        @property
-        def length(self) -> global___DerivationExpression:
-            ...
-        variation_pointer: builtins.int
-        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
-
-        def __init__(self, *, length: global___DerivationExpression | None=..., variation_pointer: builtins.int=..., nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['length', b'length']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['length', b'length', 'nullability', b'nullability', 'variation_pointer', b'variation_pointer']) -> None:
-            ...
-
-    class ExpressionVarChar(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        LENGTH_FIELD_NUMBER: builtins.int
-        VARIATION_POINTER_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-
-        @property
-        def length(self) -> global___DerivationExpression:
-            ...
-        variation_pointer: builtins.int
-        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
-
-        def __init__(self, *, length: global___DerivationExpression | None=..., variation_pointer: builtins.int=..., nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['length', b'length']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['length', b'length', 'nullability', b'nullability', 'variation_pointer', b'variation_pointer']) -> None:
-            ...
-
-    class ExpressionFixedBinary(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        LENGTH_FIELD_NUMBER: builtins.int
-        VARIATION_POINTER_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-
-        @property
-        def length(self) -> global___DerivationExpression:
-            ...
-        variation_pointer: builtins.int
-        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
-
-        def __init__(self, *, length: global___DerivationExpression | None=..., variation_pointer: builtins.int=..., nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['length', b'length']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['length', b'length', 'nullability', b'nullability', 'variation_pointer', b'variation_pointer']) -> None:
-            ...
-
-    class ExpressionDecimal(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        SCALE_FIELD_NUMBER: builtins.int
-        PRECISION_FIELD_NUMBER: builtins.int
-        VARIATION_POINTER_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-
-        @property
-        def scale(self) -> global___DerivationExpression:
-            ...
-
-        @property
-        def precision(self) -> global___DerivationExpression:
-            ...
-        variation_pointer: builtins.int
-        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
-
-        def __init__(self, *, scale: global___DerivationExpression | None=..., precision: global___DerivationExpression | None=..., variation_pointer: builtins.int=..., nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['precision', b'precision', 'scale', b'scale']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'precision', b'precision', 'scale', b'scale', 'variation_pointer', b'variation_pointer']) -> None:
-            ...
-
-    class ExpressionStruct(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPES_FIELD_NUMBER: builtins.int
-        VARIATION_POINTER_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-
-        @property
-        def types(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___DerivationExpression]:
-            ...
-        variation_pointer: builtins.int
-        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
-
-        def __init__(self, *, types: collections.abc.Iterable[global___DerivationExpression] | None=..., variation_pointer: builtins.int=..., nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'types', b'types', 'variation_pointer', b'variation_pointer']) -> None:
-            ...
-
-    class ExpressionNamedStruct(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        NAMES_FIELD_NUMBER: builtins.int
-        STRUCT_FIELD_NUMBER: builtins.int
-
-        @property
-        def names(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-            ...
-
-        @property
-        def struct(self) -> global___DerivationExpression.ExpressionStruct:
-            ...
-
-        def __init__(self, *, names: collections.abc.Iterable[builtins.str] | None=..., struct: global___DerivationExpression.ExpressionStruct | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['struct', b'struct']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['names', b'names', 'struct', b'struct']) -> None:
-            ...
-
-    class ExpressionList(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_FIELD_NUMBER: builtins.int
-        VARIATION_POINTER_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-
-        @property
-        def type(self) -> global___DerivationExpression:
-            ...
-        variation_pointer: builtins.int
-        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
-
-        def __init__(self, *, type: global___DerivationExpression | None=..., variation_pointer: builtins.int=..., nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['type', b'type']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type', b'type', 'variation_pointer', b'variation_pointer']) -> None:
-            ...
-
-    class ExpressionMap(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        KEY_FIELD_NUMBER: builtins.int
-        VALUE_FIELD_NUMBER: builtins.int
-        VARIATION_POINTER_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-
-        @property
-        def key(self) -> global___DerivationExpression:
-            ...
-
-        @property
-        def value(self) -> global___DerivationExpression:
-            ...
-        variation_pointer: builtins.int
-        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
-
-        def __init__(self, *, key: global___DerivationExpression | None=..., value: global___DerivationExpression | None=..., variation_pointer: builtins.int=..., nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['key', b'key', 'value', b'value']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['key', b'key', 'nullability', b'nullability', 'value', b'value', 'variation_pointer', b'variation_pointer']) -> None:
-            ...
-
-    class ExpressionUserDefined(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_POINTER_FIELD_NUMBER: builtins.int
-        VARIATION_POINTER_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_pointer: builtins.int
-        variation_pointer: builtins.int
-        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
-
-        def __init__(self, *, type_pointer: builtins.int=..., variation_pointer: builtins.int=..., nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_pointer', b'type_pointer', 'variation_pointer', b'variation_pointer']) -> None:
-            ...
-
-    class IfElse(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        IF_CONDITION_FIELD_NUMBER: builtins.int
-        IF_RETURN_FIELD_NUMBER: builtins.int
-        ELSE_RETURN_FIELD_NUMBER: builtins.int
-
-        @property
-        def if_condition(self) -> global___DerivationExpression:
-            ...
-
-        @property
-        def if_return(self) -> global___DerivationExpression:
-            ...
-
-        @property
-        def else_return(self) -> global___DerivationExpression:
-            ...
-
-        def __init__(self, *, if_condition: global___DerivationExpression | None=..., if_return: global___DerivationExpression | None=..., else_return: global___DerivationExpression | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['else_return', b'else_return', 'if_condition', b'if_condition', 'if_return', b'if_return']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['else_return', b'else_return', 'if_condition', b'if_condition', 'if_return', b'if_return']) -> None:
-            ...
-
-    class UnaryOp(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class _UnaryOpType:
-            ValueType = typing.NewType('ValueType', builtins.int)
-            V: typing_extensions.TypeAlias = ValueType
-
-        class _UnaryOpTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[DerivationExpression.UnaryOp._UnaryOpType.ValueType], builtins.type):
-            DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-            UNARY_OP_TYPE_UNSPECIFIED: DerivationExpression.UnaryOp._UnaryOpType.ValueType
-            UNARY_OP_TYPE_BOOLEAN_NOT: DerivationExpression.UnaryOp._UnaryOpType.ValueType
-
-        class UnaryOpType(_UnaryOpType, metaclass=_UnaryOpTypeEnumTypeWrapper):
-            ...
-        UNARY_OP_TYPE_UNSPECIFIED: DerivationExpression.UnaryOp.UnaryOpType.ValueType
-        UNARY_OP_TYPE_BOOLEAN_NOT: DerivationExpression.UnaryOp.UnaryOpType.ValueType
-        OP_TYPE_FIELD_NUMBER: builtins.int
-        ARG_FIELD_NUMBER: builtins.int
-        op_type: global___DerivationExpression.UnaryOp.UnaryOpType.ValueType
-
-        @property
-        def arg(self) -> global___DerivationExpression:
-            ...
-
-        def __init__(self, *, op_type: global___DerivationExpression.UnaryOp.UnaryOpType.ValueType=..., arg: global___DerivationExpression | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['arg', b'arg']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['arg', b'arg', 'op_type', b'op_type']) -> None:
-            ...
-
-    class BinaryOp(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class _BinaryOpType:
-            ValueType = typing.NewType('ValueType', builtins.int)
-            V: typing_extensions.TypeAlias = ValueType
-
-        class _BinaryOpTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[DerivationExpression.BinaryOp._BinaryOpType.ValueType], builtins.type):
-            DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-            BINARY_OP_TYPE_UNSPECIFIED: DerivationExpression.BinaryOp._BinaryOpType.ValueType
-            BINARY_OP_TYPE_PLUS: DerivationExpression.BinaryOp._BinaryOpType.ValueType
-            BINARY_OP_TYPE_MINUS: DerivationExpression.BinaryOp._BinaryOpType.ValueType
-            BINARY_OP_TYPE_MULTIPLY: DerivationExpression.BinaryOp._BinaryOpType.ValueType
-            BINARY_OP_TYPE_DIVIDE: DerivationExpression.BinaryOp._BinaryOpType.ValueType
-            BINARY_OP_TYPE_MIN: DerivationExpression.BinaryOp._BinaryOpType.ValueType
-            BINARY_OP_TYPE_MAX: DerivationExpression.BinaryOp._BinaryOpType.ValueType
-            BINARY_OP_TYPE_GREATER_THAN: DerivationExpression.BinaryOp._BinaryOpType.ValueType
-            BINARY_OP_TYPE_LESS_THAN: DerivationExpression.BinaryOp._BinaryOpType.ValueType
-            BINARY_OP_TYPE_AND: DerivationExpression.BinaryOp._BinaryOpType.ValueType
-            BINARY_OP_TYPE_OR: DerivationExpression.BinaryOp._BinaryOpType.ValueType
-            BINARY_OP_TYPE_EQUALS: DerivationExpression.BinaryOp._BinaryOpType.ValueType
-            BINARY_OP_TYPE_COVERS: DerivationExpression.BinaryOp._BinaryOpType.ValueType
-
-        class BinaryOpType(_BinaryOpType, metaclass=_BinaryOpTypeEnumTypeWrapper):
-            ...
-        BINARY_OP_TYPE_UNSPECIFIED: DerivationExpression.BinaryOp.BinaryOpType.ValueType
-        BINARY_OP_TYPE_PLUS: DerivationExpression.BinaryOp.BinaryOpType.ValueType
-        BINARY_OP_TYPE_MINUS: DerivationExpression.BinaryOp.BinaryOpType.ValueType
-        BINARY_OP_TYPE_MULTIPLY: DerivationExpression.BinaryOp.BinaryOpType.ValueType
-        BINARY_OP_TYPE_DIVIDE: DerivationExpression.BinaryOp.BinaryOpType.ValueType
-        BINARY_OP_TYPE_MIN: DerivationExpression.BinaryOp.BinaryOpType.ValueType
-        BINARY_OP_TYPE_MAX: DerivationExpression.BinaryOp.BinaryOpType.ValueType
-        BINARY_OP_TYPE_GREATER_THAN: DerivationExpression.BinaryOp.BinaryOpType.ValueType
-        BINARY_OP_TYPE_LESS_THAN: DerivationExpression.BinaryOp.BinaryOpType.ValueType
-        BINARY_OP_TYPE_AND: DerivationExpression.BinaryOp.BinaryOpType.ValueType
-        BINARY_OP_TYPE_OR: DerivationExpression.BinaryOp.BinaryOpType.ValueType
-        BINARY_OP_TYPE_EQUALS: DerivationExpression.BinaryOp.BinaryOpType.ValueType
-        BINARY_OP_TYPE_COVERS: DerivationExpression.BinaryOp.BinaryOpType.ValueType
-        OP_TYPE_FIELD_NUMBER: builtins.int
-        ARG1_FIELD_NUMBER: builtins.int
-        ARG2_FIELD_NUMBER: builtins.int
-        op_type: global___DerivationExpression.BinaryOp.BinaryOpType.ValueType
-
-        @property
-        def arg1(self) -> global___DerivationExpression:
-            ...
-
-        @property
-        def arg2(self) -> global___DerivationExpression:
-            ...
-
-        def __init__(self, *, op_type: global___DerivationExpression.BinaryOp.BinaryOpType.ValueType=..., arg1: global___DerivationExpression | None=..., arg2: global___DerivationExpression | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['arg1', b'arg1', 'arg2', b'arg2']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['arg1', b'arg1', 'arg2', b'arg2', 'op_type', b'op_type']) -> None:
-            ...
-
-    class ReturnProgram(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-        class Assignment(google.protobuf.message.Message):
-            DESCRIPTOR: google.protobuf.descriptor.Descriptor
-            NAME_FIELD_NUMBER: builtins.int
-            EXPRESSION_FIELD_NUMBER: builtins.int
-            name: builtins.str
-
-            @property
-            def expression(self) -> global___DerivationExpression:
-                ...
-
-            def __init__(self, *, name: builtins.str=..., expression: global___DerivationExpression | None=...) -> None:
-                ...
-
-            def HasField(self, field_name: typing_extensions.Literal['expression', b'expression']) -> builtins.bool:
-                ...
-
-            def ClearField(self, field_name: typing_extensions.Literal['expression', b'expression', 'name', b'name']) -> None:
-                ...
-        ASSIGNMENTS_FIELD_NUMBER: builtins.int
-        FINAL_EXPRESSION_FIELD_NUMBER: builtins.int
-
-        @property
-        def assignments(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___DerivationExpression.ReturnProgram.Assignment]:
-            ...
-
-        @property
-        def final_expression(self) -> global___DerivationExpression:
-            ...
-
-        def __init__(self, *, assignments: collections.abc.Iterable[global___DerivationExpression.ReturnProgram.Assignment] | None=..., final_expression: global___DerivationExpression | None=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['final_expression', b'final_expression']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['assignments', b'assignments', 'final_expression', b'final_expression']) -> None:
-            ...
-    BOOL_FIELD_NUMBER: builtins.int
-    I8_FIELD_NUMBER: builtins.int
-    I16_FIELD_NUMBER: builtins.int
-    I32_FIELD_NUMBER: builtins.int
-    I64_FIELD_NUMBER: builtins.int
-    FP32_FIELD_NUMBER: builtins.int
-    FP64_FIELD_NUMBER: builtins.int
-    STRING_FIELD_NUMBER: builtins.int
-    BINARY_FIELD_NUMBER: builtins.int
-    TIMESTAMP_FIELD_NUMBER: builtins.int
-    DATE_FIELD_NUMBER: builtins.int
-    TIME_FIELD_NUMBER: builtins.int
-    INTERVAL_YEAR_FIELD_NUMBER: builtins.int
-    INTERVAL_DAY_FIELD_NUMBER: builtins.int
-    TIMESTAMP_TZ_FIELD_NUMBER: builtins.int
-    UUID_FIELD_NUMBER: builtins.int
-    FIXED_CHAR_FIELD_NUMBER: builtins.int
-    VARCHAR_FIELD_NUMBER: builtins.int
-    FIXED_BINARY_FIELD_NUMBER: builtins.int
-    DECIMAL_FIELD_NUMBER: builtins.int
-    STRUCT_FIELD_NUMBER: builtins.int
-    LIST_FIELD_NUMBER: builtins.int
-    MAP_FIELD_NUMBER: builtins.int
-    USER_DEFINED_FIELD_NUMBER: builtins.int
-    USER_DEFINED_POINTER_FIELD_NUMBER: builtins.int
-    TYPE_PARAMETER_NAME_FIELD_NUMBER: builtins.int
-    INTEGER_PARAMETER_NAME_FIELD_NUMBER: builtins.int
-    INTEGER_LITERAL_FIELD_NUMBER: builtins.int
-    UNARY_OP_FIELD_NUMBER: builtins.int
-    BINARY_OP_FIELD_NUMBER: builtins.int
-    IF_ELSE_FIELD_NUMBER: builtins.int
-    RETURN_PROGRAM_FIELD_NUMBER: builtins.int
-
-    @property
-    def bool(self) -> substrait.ibis.type_pb2.Type.Boolean:
-        ...
-
-    @property
-    def i8(self) -> substrait.ibis.type_pb2.Type.I8:
-        ...
-
-    @property
-    def i16(self) -> substrait.ibis.type_pb2.Type.I16:
-        ...
-
-    @property
-    def i32(self) -> substrait.ibis.type_pb2.Type.I32:
-        ...
-
-    @property
-    def i64(self) -> substrait.ibis.type_pb2.Type.I64:
-        ...
-
-    @property
-    def fp32(self) -> substrait.ibis.type_pb2.Type.FP32:
-        ...
-
-    @property
-    def fp64(self) -> substrait.ibis.type_pb2.Type.FP64:
-        ...
-
-    @property
-    def string(self) -> substrait.ibis.type_pb2.Type.String:
-        ...
-
-    @property
-    def binary(self) -> substrait.ibis.type_pb2.Type.Binary:
-        ...
-
-    @property
-    def timestamp(self) -> substrait.ibis.type_pb2.Type.Timestamp:
-        ...
-
-    @property
-    def date(self) -> substrait.ibis.type_pb2.Type.Date:
-        ...
-
-    @property
-    def time(self) -> substrait.ibis.type_pb2.Type.Time:
-        ...
-
-    @property
-    def interval_year(self) -> substrait.ibis.type_pb2.Type.IntervalYear:
-        ...
-
-    @property
-    def interval_day(self) -> substrait.ibis.type_pb2.Type.IntervalDay:
-        ...
-
-    @property
-    def timestamp_tz(self) -> substrait.ibis.type_pb2.Type.TimestampTZ:
-        ...
-
-    @property
-    def uuid(self) -> substrait.ibis.type_pb2.Type.UUID:
-        ...
-
-    @property
-    def fixed_char(self) -> global___DerivationExpression.ExpressionFixedChar:
-        ...
-
-    @property
-    def varchar(self) -> global___DerivationExpression.ExpressionVarChar:
-        ...
-
-    @property
-    def fixed_binary(self) -> global___DerivationExpression.ExpressionFixedBinary:
-        ...
-
-    @property
-    def decimal(self) -> global___DerivationExpression.ExpressionDecimal:
-        ...
-
-    @property
-    def struct(self) -> global___DerivationExpression.ExpressionStruct:
-        ...
-
-    @property
-    def list(self) -> global___DerivationExpression.ExpressionList:
-        ...
-
-    @property
-    def map(self) -> global___DerivationExpression.ExpressionMap:
-        ...
-
-    @property
-    def user_defined(self) -> global___DerivationExpression.ExpressionUserDefined:
-        ...
-    user_defined_pointer: builtins.int
-    'Deprecated in favor of user_defined, which allows nullability and\n    variations to be specified. If user_defined_pointer is encountered,\n    treat it as being non-nullable and having the default variation.\n    '
-    type_parameter_name: builtins.str
-    integer_parameter_name: builtins.str
-    integer_literal: builtins.int
-
-    @property
-    def unary_op(self) -> global___DerivationExpression.UnaryOp:
-        ...
-
-    @property
-    def binary_op(self) -> global___DerivationExpression.BinaryOp:
-        ...
-
-    @property
-    def if_else(self) -> global___DerivationExpression.IfElse:
-        ...
-
-    @property
-    def return_program(self) -> global___DerivationExpression.ReturnProgram:
-        ...
-
-    def __init__(self, *, bool: substrait.ibis.type_pb2.Type.Boolean | None=..., i8: substrait.ibis.type_pb2.Type.I8 | None=..., i16: substrait.ibis.type_pb2.Type.I16 | None=..., i32: substrait.ibis.type_pb2.Type.I32 | None=..., i64: substrait.ibis.type_pb2.Type.I64 | None=..., fp32: substrait.ibis.type_pb2.Type.FP32 | None=..., fp64: substrait.ibis.type_pb2.Type.FP64 | None=..., string: substrait.ibis.type_pb2.Type.String | None=..., binary: substrait.ibis.type_pb2.Type.Binary | None=..., timestamp: substrait.ibis.type_pb2.Type.Timestamp | None=..., date: substrait.ibis.type_pb2.Type.Date | None=..., time: substrait.ibis.type_pb2.Type.Time | None=..., interval_year: substrait.ibis.type_pb2.Type.IntervalYear | None=..., interval_day: substrait.ibis.type_pb2.Type.IntervalDay | None=..., timestamp_tz: substrait.ibis.type_pb2.Type.TimestampTZ | None=..., uuid: substrait.ibis.type_pb2.Type.UUID | None=..., fixed_char: global___DerivationExpression.ExpressionFixedChar | None=..., varchar: global___DerivationExpression.ExpressionVarChar | None=..., fixed_binary: global___DerivationExpression.ExpressionFixedBinary | None=..., decimal: global___DerivationExpression.ExpressionDecimal | None=..., struct: global___DerivationExpression.ExpressionStruct | None=..., list: global___DerivationExpression.ExpressionList | None=..., map: global___DerivationExpression.ExpressionMap | None=..., user_defined: global___DerivationExpression.ExpressionUserDefined | None=..., user_defined_pointer: builtins.int=..., type_parameter_name: builtins.str=..., integer_parameter_name: builtins.str=..., integer_literal: builtins.int=..., unary_op: global___DerivationExpression.UnaryOp | None=..., binary_op: global___DerivationExpression.BinaryOp | None=..., if_else: global___DerivationExpression.IfElse | None=..., return_program: global___DerivationExpression.ReturnProgram | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['binary', b'binary', 'binary_op', b'binary_op', 'bool', b'bool', 'date', b'date', 'decimal', b'decimal', 'fixed_binary', b'fixed_binary', 'fixed_char', b'fixed_char', 'fp32', b'fp32', 'fp64', b'fp64', 'i16', b'i16', 'i32', b'i32', 'i64', b'i64', 'i8', b'i8', 'if_else', b'if_else', 'integer_literal', b'integer_literal', 'integer_parameter_name', b'integer_parameter_name', 'interval_day', b'interval_day', 'interval_year', b'interval_year', 'kind', b'kind', 'list', b'list', 'map', b'map', 'return_program', b'return_program', 'string', b'string', 'struct', b'struct', 'time', b'time', 'timestamp', b'timestamp', 'timestamp_tz', b'timestamp_tz', 'type_parameter_name', b'type_parameter_name', 'unary_op', b'unary_op', 'user_defined', b'user_defined', 'user_defined_pointer', b'user_defined_pointer', 'uuid', b'uuid', 'varchar', b'varchar']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['binary', b'binary', 'binary_op', b'binary_op', 'bool', b'bool', 'date', b'date', 'decimal', b'decimal', 'fixed_binary', b'fixed_binary', 'fixed_char', b'fixed_char', 'fp32', b'fp32', 'fp64', b'fp64', 'i16', b'i16', 'i32', b'i32', 'i64', b'i64', 'i8', b'i8', 'if_else', b'if_else', 'integer_literal', b'integer_literal', 'integer_parameter_name', b'integer_parameter_name', 'interval_day', b'interval_day', 'interval_year', b'interval_year', 'kind', b'kind', 'list', b'list', 'map', b'map', 'return_program', b'return_program', 'string', b'string', 'struct', b'struct', 'time', b'time', 'timestamp', b'timestamp', 'timestamp_tz', b'timestamp_tz', 'type_parameter_name', b'type_parameter_name', 'unary_op', b'unary_op', 'user_defined', b'user_defined', 'user_defined_pointer', b'user_defined_pointer', 'uuid', b'uuid', 'varchar', b'varchar']) -> None:
-        ...
-
-    def WhichOneof(self, oneof_group: typing_extensions.Literal['kind', b'kind']) -> typing_extensions.Literal['bool', 'i8', 'i16', 'i32', 'i64', 'fp32', 'fp64', 'string', 'binary', 'timestamp', 'date', 'time', 'interval_year', 'interval_day', 'timestamp_tz', 'uuid', 'fixed_char', 'varchar', 'fixed_binary', 'decimal', 'struct', 'list', 'map', 'user_defined', 'user_defined_pointer', 'type_parameter_name', 'integer_parameter_name', 'integer_literal', 'unary_op', 'binary_op', 'if_else', 'return_program'] | None:
-        ...
-global___DerivationExpression = DerivationExpression
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/ibis/type_pb2.py b/ibis_substrait/proto/substrait/ibis/type_pb2.py
deleted file mode 100644
index 116cb846..00000000
--- a/ibis_substrait/proto/substrait/ibis/type_pb2.py
+++ /dev/null
@@ -1,71 +0,0 @@
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-_sym_db = _symbol_database.Default()
-from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19substrait/ibis/type.proto\x12\x0esubstrait.ibis\x1a\x1bgoogle/protobuf/empty.proto"\xcb*\n\x04Type\x122\n\x04bool\x18\x01 \x01(\x0b2\x1c.substrait.ibis.Type.BooleanH\x00R\x04bool\x12)\n\x02i8\x18\x02 \x01(\x0b2\x17.substrait.ibis.Type.I8H\x00R\x02i8\x12,\n\x03i16\x18\x03 \x01(\x0b2\x18.substrait.ibis.Type.I16H\x00R\x03i16\x12,\n\x03i32\x18\x05 \x01(\x0b2\x18.substrait.ibis.Type.I32H\x00R\x03i32\x12,\n\x03i64\x18\x07 \x01(\x0b2\x18.substrait.ibis.Type.I64H\x00R\x03i64\x12/\n\x04fp32\x18\n \x01(\x0b2\x19.substrait.ibis.Type.FP32H\x00R\x04fp32\x12/\n\x04fp64\x18\x0b \x01(\x0b2\x19.substrait.ibis.Type.FP64H\x00R\x04fp64\x125\n\x06string\x18\x0c \x01(\x0b2\x1b.substrait.ibis.Type.StringH\x00R\x06string\x125\n\x06binary\x18\r \x01(\x0b2\x1b.substrait.ibis.Type.BinaryH\x00R\x06binary\x12>\n\ttimestamp\x18\x0e \x01(\x0b2\x1e.substrait.ibis.Type.TimestampH\x00R\ttimestamp\x12/\n\x04date\x18\x10 \x01(\x0b2\x19.substrait.ibis.Type.DateH\x00R\x04date\x12/\n\x04time\x18\x11 \x01(\x0b2\x19.substrait.ibis.Type.TimeH\x00R\x04time\x12H\n\rinterval_year\x18\x13 \x01(\x0b2!.substrait.ibis.Type.IntervalYearH\x00R\x0cintervalYear\x12E\n\x0cinterval_day\x18\x14 \x01(\x0b2 .substrait.ibis.Type.IntervalDayH\x00R\x0bintervalDay\x12E\n\x0ctimestamp_tz\x18\x1d \x01(\x0b2 .substrait.ibis.Type.TimestampTZH\x00R\x0btimestampTz\x12/\n\x04uuid\x18  \x01(\x0b2\x19.substrait.ibis.Type.UUIDH\x00R\x04uuid\x12?\n\nfixed_char\x18\x15 \x01(\x0b2\x1e.substrait.ibis.Type.FixedCharH\x00R\tfixedChar\x128\n\x07varchar\x18\x16 \x01(\x0b2\x1c.substrait.ibis.Type.VarCharH\x00R\x07varchar\x12E\n\x0cfixed_binary\x18\x17 \x01(\x0b2 .substrait.ibis.Type.FixedBinaryH\x00R\x0bfixedBinary\x128\n\x07decimal\x18\x18 \x01(\x0b2\x1c.substrait.ibis.Type.DecimalH\x00R\x07decimal\x125\n\x06struct\x18\x19 \x01(\x0b2\x1b.substrait.ibis.Type.StructH\x00R\x06struct\x12/\n\x04list\x18\x1b \x01(\x0b2\x19.substrait.ibis.Type.ListH\x00R\x04list\x12,\n\x03map\x18\x1c \x01(\x0b2\x18.substrait.ibis.Type.MapH\x00R\x03map\x12E\n\x0cuser_defined\x18\x1e \x01(\x0b2 .substrait.ibis.Type.UserDefinedH\x00R\x0buserDefined\x12C\n\x1buser_defined_type_reference\x18\x1f \x01(\rB\x02\x18\x01H\x00R\x18userDefinedTypeReference\x1a\x87\x01\n\x07Boolean\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x02 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x82\x01\n\x02I8\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x02 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x83\x01\n\x03I16\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x02 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x83\x01\n\x03I32\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x02 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x83\x01\n\x03I64\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x02 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x84\x01\n\x04FP32\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x02 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x84\x01\n\x04FP64\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x02 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x86\x01\n\x06String\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x02 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x86\x01\n\x06Binary\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x02 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x89\x01\n\tTimestamp\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x02 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x84\x01\n\x04Date\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x02 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x84\x01\n\x04Time\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x02 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x8b\x01\n\x0bTimestampTZ\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x02 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x8c\x01\n\x0cIntervalYear\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x02 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x8b\x01\n\x0bIntervalDay\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x02 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x84\x01\n\x04UUID\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x02 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xa1\x01\n\tFixedChar\x12\x16\n\x06length\x18\x01 \x01(\x05R\x06length\x128\n\x18type_variation_reference\x18\x02 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\x9f\x01\n\x07VarChar\x12\x16\n\x06length\x18\x01 \x01(\x05R\x06length\x128\n\x18type_variation_reference\x18\x02 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xa3\x01\n\x0bFixedBinary\x12\x16\n\x06length\x18\x01 \x01(\x05R\x06length\x128\n\x18type_variation_reference\x18\x02 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xbb\x01\n\x07Decimal\x12\x14\n\x05scale\x18\x01 \x01(\x05R\x05scale\x12\x1c\n\tprecision\x18\x02 \x01(\x05R\tprecision\x128\n\x18type_variation_reference\x18\x03 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x04 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xb2\x01\n\x06Struct\x12*\n\x05types\x18\x01 \x03(\x0b2\x14.substrait.ibis.TypeR\x05types\x128\n\x18type_variation_reference\x18\x02 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xae\x01\n\x04List\x12(\n\x04type\x18\x01 \x01(\x0b2\x14.substrait.ibis.TypeR\x04type\x128\n\x18type_variation_reference\x18\x02 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xd7\x01\n\x03Map\x12&\n\x03key\x18\x01 \x01(\x0b2\x14.substrait.ibis.TypeR\x03key\x12*\n\x05value\x18\x02 \x01(\x0b2\x14.substrait.ibis.TypeR\x05value\x128\n\x18type_variation_reference\x18\x03 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x04 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x1a\xfb\x01\n\x0bUserDefined\x12%\n\x0etype_reference\x18\x01 \x01(\rR\rtypeReference\x128\n\x18type_variation_reference\x18\x02 \x01(\rR\x16typeVariationReference\x12B\n\x0bnullability\x18\x03 \x01(\x0e2 .substrait.ibis.Type.NullabilityR\x0bnullability\x12G\n\x0ftype_parameters\x18\x04 \x03(\x0b2\x1e.substrait.ibis.Type.ParameterR\x0etypeParameters\x1a\xe3\x01\n\tParameter\x12,\n\x04null\x18\x01 \x01(\x0b2\x16.google.protobuf.EmptyH\x00R\x04null\x123\n\tdata_type\x18\x02 \x01(\x0b2\x14.substrait.ibis.TypeH\x00R\x08dataType\x12\x1a\n\x07boolean\x18\x03 \x01(\x08H\x00R\x07boolean\x12\x1a\n\x07integer\x18\x04 \x01(\x03H\x00R\x07integer\x12\x14\n\x04enum\x18\x05 \x01(\tH\x00R\x04enum\x12\x18\n\x06string\x18\x06 \x01(\tH\x00R\x06stringB\x0b\n\tparameter"^\n\x0bNullability\x12\x1b\n\x17NULLABILITY_UNSPECIFIED\x10\x00\x12\x18\n\x14NULLABILITY_NULLABLE\x10\x01\x12\x18\n\x14NULLABILITY_REQUIRED\x10\x02B\x06\n\x04kind"X\n\x0bNamedStruct\x12\x14\n\x05names\x18\x01 \x03(\tR\x05names\x123\n\x06struct\x18\x02 \x01(\x0b2\x1b.substrait.ibis.Type.StructR\x06structB5\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobufb\x06proto3')
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'substrait.ibis.type_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-    DESCRIPTOR._options = None
-    DESCRIPTOR._serialized_options = b'\n\x17io.substrait.ibis.protoP\x01\xaa\x02\x17Substrait.Ibis.Protobuf'
-    _TYPE.fields_by_name['user_defined_type_reference']._options = None
-    _TYPE.fields_by_name['user_defined_type_reference']._serialized_options = b'\x18\x01'
-    _TYPE._serialized_start = 75
-    _TYPE._serialized_end = 5526
-    _TYPE_BOOLEAN._serialized_start = 1494
-    _TYPE_BOOLEAN._serialized_end = 1629
-    _TYPE_I8._serialized_start = 1632
-    _TYPE_I8._serialized_end = 1762
-    _TYPE_I16._serialized_start = 1765
-    _TYPE_I16._serialized_end = 1896
-    _TYPE_I32._serialized_start = 1899
-    _TYPE_I32._serialized_end = 2030
-    _TYPE_I64._serialized_start = 2033
-    _TYPE_I64._serialized_end = 2164
-    _TYPE_FP32._serialized_start = 2167
-    _TYPE_FP32._serialized_end = 2299
-    _TYPE_FP64._serialized_start = 2302
-    _TYPE_FP64._serialized_end = 2434
-    _TYPE_STRING._serialized_start = 2437
-    _TYPE_STRING._serialized_end = 2571
-    _TYPE_BINARY._serialized_start = 2574
-    _TYPE_BINARY._serialized_end = 2708
-    _TYPE_TIMESTAMP._serialized_start = 2711
-    _TYPE_TIMESTAMP._serialized_end = 2848
-    _TYPE_DATE._serialized_start = 2851
-    _TYPE_DATE._serialized_end = 2983
-    _TYPE_TIME._serialized_start = 2986
-    _TYPE_TIME._serialized_end = 3118
-    _TYPE_TIMESTAMPTZ._serialized_start = 3121
-    _TYPE_TIMESTAMPTZ._serialized_end = 3260
-    _TYPE_INTERVALYEAR._serialized_start = 3263
-    _TYPE_INTERVALYEAR._serialized_end = 3403
-    _TYPE_INTERVALDAY._serialized_start = 3406
-    _TYPE_INTERVALDAY._serialized_end = 3545
-    _TYPE_UUID._serialized_start = 3548
-    _TYPE_UUID._serialized_end = 3680
-    _TYPE_FIXEDCHAR._serialized_start = 3683
-    _TYPE_FIXEDCHAR._serialized_end = 3844
-    _TYPE_VARCHAR._serialized_start = 3847
-    _TYPE_VARCHAR._serialized_end = 4006
-    _TYPE_FIXEDBINARY._serialized_start = 4009
-    _TYPE_FIXEDBINARY._serialized_end = 4172
-    _TYPE_DECIMAL._serialized_start = 4175
-    _TYPE_DECIMAL._serialized_end = 4362
-    _TYPE_STRUCT._serialized_start = 4365
-    _TYPE_STRUCT._serialized_end = 4543
-    _TYPE_LIST._serialized_start = 4546
-    _TYPE_LIST._serialized_end = 4720
-    _TYPE_MAP._serialized_start = 4723
-    _TYPE_MAP._serialized_end = 4938
-    _TYPE_USERDEFINED._serialized_start = 4941
-    _TYPE_USERDEFINED._serialized_end = 5192
-    _TYPE_PARAMETER._serialized_start = 5195
-    _TYPE_PARAMETER._serialized_end = 5422
-    _TYPE_NULLABILITY._serialized_start = 5424
-    _TYPE_NULLABILITY._serialized_end = 5518
-    _NAMEDSTRUCT._serialized_start = 5528
-    _NAMEDSTRUCT._serialized_end = 5616
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/ibis/type_pb2.pyi b/ibis_substrait/proto/substrait/ibis/type_pb2.pyi
deleted file mode 100644
index a10cc977..00000000
--- a/ibis_substrait/proto/substrait/ibis/type_pb2.pyi
+++ /dev/null
@@ -1,608 +0,0 @@
-"""
-@generated by mypy-protobuf.  Do not edit manually!
-isort:skip_file
-SPDX-License-Identifier: Apache-2.0"""
-import builtins
-import collections.abc
-import google.protobuf.descriptor
-import google.protobuf.empty_pb2
-import google.protobuf.internal.containers
-import google.protobuf.internal.enum_type_wrapper
-import google.protobuf.message
-import sys
-import typing
-if sys.version_info >= (3, 10):
-    import typing as typing_extensions
-else:
-    import typing_extensions
-DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
-
-class Type(google.protobuf.message.Message):
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-
-    class _Nullability:
-        ValueType = typing.NewType('ValueType', builtins.int)
-        V: typing_extensions.TypeAlias = ValueType
-
-    class _NullabilityEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Type._Nullability.ValueType], builtins.type):
-        DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
-        NULLABILITY_UNSPECIFIED: Type._Nullability.ValueType
-        NULLABILITY_NULLABLE: Type._Nullability.ValueType
-        NULLABILITY_REQUIRED: Type._Nullability.ValueType
-
-    class Nullability(_Nullability, metaclass=_NullabilityEnumTypeWrapper):
-        ...
-    NULLABILITY_UNSPECIFIED: Type.Nullability.ValueType
-    NULLABILITY_NULLABLE: Type.Nullability.ValueType
-    NULLABILITY_REQUIRED: Type.Nullability.ValueType
-
-    class Boolean(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class I8(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class I16(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class I32(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class I64(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class FP32(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class FP64(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class String(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class Binary(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class Timestamp(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class Date(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class Time(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class TimestampTZ(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class IntervalYear(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class IntervalDay(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class UUID(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class FixedChar(google.protobuf.message.Message):
-        """Start compound types."""
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        LENGTH_FIELD_NUMBER: builtins.int
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        length: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, length: builtins.int=..., type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['length', b'length', 'nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class VarChar(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        LENGTH_FIELD_NUMBER: builtins.int
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        length: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, length: builtins.int=..., type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['length', b'length', 'nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class FixedBinary(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        LENGTH_FIELD_NUMBER: builtins.int
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        length: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, length: builtins.int=..., type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['length', b'length', 'nullability', b'nullability', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class Decimal(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        SCALE_FIELD_NUMBER: builtins.int
-        PRECISION_FIELD_NUMBER: builtins.int
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        scale: builtins.int
-        precision: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, scale: builtins.int=..., precision: builtins.int=..., type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'precision', b'precision', 'scale', b'scale', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class Struct(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPES_FIELD_NUMBER: builtins.int
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-
-        @property
-        def types(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Type]:
-            ...
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, types: collections.abc.Iterable[global___Type] | None=..., type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_variation_reference', b'type_variation_reference', 'types', b'types']) -> None:
-            ...
-
-    class List(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_FIELD_NUMBER: builtins.int
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-
-        @property
-        def type(self) -> global___Type:
-            ...
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, type: global___Type | None=..., type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['type', b'type']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type', b'type', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class Map(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        KEY_FIELD_NUMBER: builtins.int
-        VALUE_FIELD_NUMBER: builtins.int
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-
-        @property
-        def key(self) -> global___Type:
-            ...
-
-        @property
-        def value(self) -> global___Type:
-            ...
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        def __init__(self, *, key: global___Type | None=..., value: global___Type | None=..., type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['key', b'key', 'value', b'value']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['key', b'key', 'nullability', b'nullability', 'type_variation_reference', b'type_variation_reference', 'value', b'value']) -> None:
-            ...
-
-    class UserDefined(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        TYPE_REFERENCE_FIELD_NUMBER: builtins.int
-        TYPE_VARIATION_REFERENCE_FIELD_NUMBER: builtins.int
-        NULLABILITY_FIELD_NUMBER: builtins.int
-        TYPE_PARAMETERS_FIELD_NUMBER: builtins.int
-        type_reference: builtins.int
-        type_variation_reference: builtins.int
-        nullability: global___Type.Nullability.ValueType
-
-        @property
-        def type_parameters(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Type.Parameter]:
-            ...
-
-        def __init__(self, *, type_reference: builtins.int=..., type_variation_reference: builtins.int=..., nullability: global___Type.Nullability.ValueType=..., type_parameters: collections.abc.Iterable[global___Type.Parameter] | None=...) -> None:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['nullability', b'nullability', 'type_parameters', b'type_parameters', 'type_reference', b'type_reference', 'type_variation_reference', b'type_variation_reference']) -> None:
-            ...
-
-    class Parameter(google.protobuf.message.Message):
-        DESCRIPTOR: google.protobuf.descriptor.Descriptor
-        NULL_FIELD_NUMBER: builtins.int
-        DATA_TYPE_FIELD_NUMBER: builtins.int
-        BOOLEAN_FIELD_NUMBER: builtins.int
-        INTEGER_FIELD_NUMBER: builtins.int
-        ENUM_FIELD_NUMBER: builtins.int
-        STRING_FIELD_NUMBER: builtins.int
-
-        @property
-        def null(self) -> google.protobuf.empty_pb2.Empty:
-            """Explicitly null/unspecified parameter, to select the default value (if
-            any).
-            """
-
-        @property
-        def data_type(self) -> global___Type:
-            """Data type parameters, like the i32 in LIST<i32>."""
-        boolean: builtins.bool
-        'Value parameters, like the 10 in VARCHAR<10>.'
-        integer: builtins.int
-        enum: builtins.str
-        string: builtins.str
-
-        def __init__(self, *, null: google.protobuf.empty_pb2.Empty | None=..., data_type: global___Type | None=..., boolean: builtins.bool=..., integer: builtins.int=..., enum: builtins.str=..., string: builtins.str=...) -> None:
-            ...
-
-        def HasField(self, field_name: typing_extensions.Literal['boolean', b'boolean', 'data_type', b'data_type', 'enum', b'enum', 'integer', b'integer', 'null', b'null', 'parameter', b'parameter', 'string', b'string']) -> builtins.bool:
-            ...
-
-        def ClearField(self, field_name: typing_extensions.Literal['boolean', b'boolean', 'data_type', b'data_type', 'enum', b'enum', 'integer', b'integer', 'null', b'null', 'parameter', b'parameter', 'string', b'string']) -> None:
-            ...
-
-        def WhichOneof(self, oneof_group: typing_extensions.Literal['parameter', b'parameter']) -> typing_extensions.Literal['null', 'data_type', 'boolean', 'integer', 'enum', 'string'] | None:
-            ...
-    BOOL_FIELD_NUMBER: builtins.int
-    I8_FIELD_NUMBER: builtins.int
-    I16_FIELD_NUMBER: builtins.int
-    I32_FIELD_NUMBER: builtins.int
-    I64_FIELD_NUMBER: builtins.int
-    FP32_FIELD_NUMBER: builtins.int
-    FP64_FIELD_NUMBER: builtins.int
-    STRING_FIELD_NUMBER: builtins.int
-    BINARY_FIELD_NUMBER: builtins.int
-    TIMESTAMP_FIELD_NUMBER: builtins.int
-    DATE_FIELD_NUMBER: builtins.int
-    TIME_FIELD_NUMBER: builtins.int
-    INTERVAL_YEAR_FIELD_NUMBER: builtins.int
-    INTERVAL_DAY_FIELD_NUMBER: builtins.int
-    TIMESTAMP_TZ_FIELD_NUMBER: builtins.int
-    UUID_FIELD_NUMBER: builtins.int
-    FIXED_CHAR_FIELD_NUMBER: builtins.int
-    VARCHAR_FIELD_NUMBER: builtins.int
-    FIXED_BINARY_FIELD_NUMBER: builtins.int
-    DECIMAL_FIELD_NUMBER: builtins.int
-    STRUCT_FIELD_NUMBER: builtins.int
-    LIST_FIELD_NUMBER: builtins.int
-    MAP_FIELD_NUMBER: builtins.int
-    USER_DEFINED_FIELD_NUMBER: builtins.int
-    USER_DEFINED_TYPE_REFERENCE_FIELD_NUMBER: builtins.int
-
-    @property
-    def bool(self) -> global___Type.Boolean:
-        ...
-
-    @property
-    def i8(self) -> global___Type.I8:
-        ...
-
-    @property
-    def i16(self) -> global___Type.I16:
-        ...
-
-    @property
-    def i32(self) -> global___Type.I32:
-        ...
-
-    @property
-    def i64(self) -> global___Type.I64:
-        ...
-
-    @property
-    def fp32(self) -> global___Type.FP32:
-        ...
-
-    @property
-    def fp64(self) -> global___Type.FP64:
-        ...
-
-    @property
-    def string(self) -> global___Type.String:
-        ...
-
-    @property
-    def binary(self) -> global___Type.Binary:
-        ...
-
-    @property
-    def timestamp(self) -> global___Type.Timestamp:
-        ...
-
-    @property
-    def date(self) -> global___Type.Date:
-        ...
-
-    @property
-    def time(self) -> global___Type.Time:
-        ...
-
-    @property
-    def interval_year(self) -> global___Type.IntervalYear:
-        ...
-
-    @property
-    def interval_day(self) -> global___Type.IntervalDay:
-        ...
-
-    @property
-    def timestamp_tz(self) -> global___Type.TimestampTZ:
-        ...
-
-    @property
-    def uuid(self) -> global___Type.UUID:
-        ...
-
-    @property
-    def fixed_char(self) -> global___Type.FixedChar:
-        ...
-
-    @property
-    def varchar(self) -> global___Type.VarChar:
-        ...
-
-    @property
-    def fixed_binary(self) -> global___Type.FixedBinary:
-        ...
-
-    @property
-    def decimal(self) -> global___Type.Decimal:
-        ...
-
-    @property
-    def struct(self) -> global___Type.Struct:
-        ...
-
-    @property
-    def list(self) -> global___Type.List:
-        ...
-
-    @property
-    def map(self) -> global___Type.Map:
-        ...
-
-    @property
-    def user_defined(self) -> global___Type.UserDefined:
-        ...
-    user_defined_type_reference: builtins.int
-    'Deprecated in favor of user_defined, which allows nullability and\n    variations to be specified. If user_defined_type_reference is\n    encountered, treat it as being non-nullable and having the default\n    variation.\n    '
-
-    def __init__(self, *, bool: global___Type.Boolean | None=..., i8: global___Type.I8 | None=..., i16: global___Type.I16 | None=..., i32: global___Type.I32 | None=..., i64: global___Type.I64 | None=..., fp32: global___Type.FP32 | None=..., fp64: global___Type.FP64 | None=..., string: global___Type.String | None=..., binary: global___Type.Binary | None=..., timestamp: global___Type.Timestamp | None=..., date: global___Type.Date | None=..., time: global___Type.Time | None=..., interval_year: global___Type.IntervalYear | None=..., interval_day: global___Type.IntervalDay | None=..., timestamp_tz: global___Type.TimestampTZ | None=..., uuid: global___Type.UUID | None=..., fixed_char: global___Type.FixedChar | None=..., varchar: global___Type.VarChar | None=..., fixed_binary: global___Type.FixedBinary | None=..., decimal: global___Type.Decimal | None=..., struct: global___Type.Struct | None=..., list: global___Type.List | None=..., map: global___Type.Map | None=..., user_defined: global___Type.UserDefined | None=..., user_defined_type_reference: builtins.int=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['binary', b'binary', 'bool', b'bool', 'date', b'date', 'decimal', b'decimal', 'fixed_binary', b'fixed_binary', 'fixed_char', b'fixed_char', 'fp32', b'fp32', 'fp64', b'fp64', 'i16', b'i16', 'i32', b'i32', 'i64', b'i64', 'i8', b'i8', 'interval_day', b'interval_day', 'interval_year', b'interval_year', 'kind', b'kind', 'list', b'list', 'map', b'map', 'string', b'string', 'struct', b'struct', 'time', b'time', 'timestamp', b'timestamp', 'timestamp_tz', b'timestamp_tz', 'user_defined', b'user_defined', 'user_defined_type_reference', b'user_defined_type_reference', 'uuid', b'uuid', 'varchar', b'varchar']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['binary', b'binary', 'bool', b'bool', 'date', b'date', 'decimal', b'decimal', 'fixed_binary', b'fixed_binary', 'fixed_char', b'fixed_char', 'fp32', b'fp32', 'fp64', b'fp64', 'i16', b'i16', 'i32', b'i32', 'i64', b'i64', 'i8', b'i8', 'interval_day', b'interval_day', 'interval_year', b'interval_year', 'kind', b'kind', 'list', b'list', 'map', b'map', 'string', b'string', 'struct', b'struct', 'time', b'time', 'timestamp', b'timestamp', 'timestamp_tz', b'timestamp_tz', 'user_defined', b'user_defined', 'user_defined_type_reference', b'user_defined_type_reference', 'uuid', b'uuid', 'varchar', b'varchar']) -> None:
-        ...
-
-    def WhichOneof(self, oneof_group: typing_extensions.Literal['kind', b'kind']) -> typing_extensions.Literal['bool', 'i8', 'i16', 'i32', 'i64', 'fp32', 'fp64', 'string', 'binary', 'timestamp', 'date', 'time', 'interval_year', 'interval_day', 'timestamp_tz', 'uuid', 'fixed_char', 'varchar', 'fixed_binary', 'decimal', 'struct', 'list', 'map', 'user_defined', 'user_defined_type_reference'] | None:
-        ...
-global___Type = Type
-
-class NamedStruct(google.protobuf.message.Message):
-    """A message for modeling name/type pairs.
-
-    Useful for representing relation schemas.
-
-    Notes:
-
-    * The names field is in depth-first order.
-
-    For example a schema such as:
-
-    a: int64
-    b: struct<c: float32, d: string>
-
-    would have a `names` field that looks like:
-
-    ["a", "b", "c", "d"]
-
-    * Only struct fields are contained in this field's elements,
-    * Map keys should be traversed first, then values when producing/consuming
-    """
-    DESCRIPTOR: google.protobuf.descriptor.Descriptor
-    NAMES_FIELD_NUMBER: builtins.int
-    STRUCT_FIELD_NUMBER: builtins.int
-
-    @property
-    def names(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
-        """list of names in dfs order"""
-
-    @property
-    def struct(self) -> global___Type.Struct:
-        ...
-
-    def __init__(self, *, names: collections.abc.Iterable[builtins.str] | None=..., struct: global___Type.Struct | None=...) -> None:
-        ...
-
-    def HasField(self, field_name: typing_extensions.Literal['struct', b'struct']) -> builtins.bool:
-        ...
-
-    def ClearField(self, field_name: typing_extensions.Literal['names', b'names', 'struct', b'struct']) -> None:
-        ...
-global___NamedStruct = NamedStruct
\ No newline at end of file
diff --git a/nix/overlay.nix b/nix/overlay.nix
index 3f4579c1..70275155 100644
--- a/nix/overlay.nix
+++ b/nix/overlay.nix
@@ -27,11 +27,6 @@ let
         checkGroups = [ "test" ];
         preferWheels = true;
 
-        # remove the build/ folder generated by `build.py`
-        preCheck = ''
-          rm -r build
-        '';
-
         checkPhase = ''
           runHook preCheck
           pytest
@@ -44,19 +39,10 @@ let
     final.callPackage drv { inherit python; };
 in
 {
-  substrait = final.fetchFromGitHub {
-    owner = "substrait-io";
-    repo = "substrait";
-    rev = "335a4dc74ccb3ef88769878d36c35e511e47ef70";
-    sha256 = "q4kZBObYCgPSoxOAJAHuPrKcm0T+rWqRqUibHidtfPs=";
-  };
-
-  ibisSubstraitDevEnv38 = mkPoetryEnv final.python38;
   ibisSubstraitDevEnv39 = mkPoetryEnv final.python39;
   ibisSubstraitDevEnv310 = mkPoetryEnv final.python310;
   ibisSubstraitDevEnv311 = mkPoetryEnv final.python311;
 
-  ibisSubstrait38 = mkIbisSubstrait final.python38;
   ibisSubstrait39 = mkIbisSubstrait final.python39;
   ibisSubstrait310 = mkIbisSubstrait final.python310;
   ibisSubstrait311 = mkIbisSubstrait final.python311;
diff --git a/poetry.lock b/poetry.lock
index fb74ca16..5b271151 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,9 +1,10 @@
-# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand.
+# This file is automatically @generated by Poetry and should not be changed by hand.
 
 [[package]]
 name = "appnope"
 version = "0.1.3"
 description = "Disable App Nap on macOS >= 10.9"
+category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -15,6 +16,7 @@ files = [
 name = "asttokens"
 version = "2.2.1"
 description = "Annotate AST trees with source code positions"
+category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -28,25 +30,11 @@ six = "*"
 [package.extras]
 test = ["astroid", "pytest"]
 
-[[package]]
-name = "astunparse"
-version = "1.6.3"
-description = "An AST unparser for Python"
-optional = false
-python-versions = "*"
-files = [
-    {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"},
-    {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"},
-]
-
-[package.dependencies]
-six = ">=1.6.1,<2.0"
-wheel = ">=0.23.0,<1.0"
-
 [[package]]
 name = "atpublic"
 version = "3.1.1"
 description = "Keep all y'all's __all__'s in sync"
+category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -58,6 +46,7 @@ files = [
 name = "backcall"
 version = "0.2.0"
 description = "Specifications for callback functions passed in to an API"
+category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -69,6 +58,7 @@ files = [
 name = "black"
 version = "23.1.0"
 description = "The uncompromising code formatter."
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -118,6 +108,7 @@ uvloop = ["uvloop (>=0.15.2)"]
 name = "click"
 version = "8.1.3"
 description = "Composable command line interface toolkit"
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -132,6 +123,7 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""}
 name = "colorama"
 version = "0.4.6"
 description = "Cross-platform colored terminal text."
+category = "dev"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
 files = [
@@ -143,6 +135,7 @@ files = [
 name = "coverage"
 version = "7.0.5"
 description = "Code coverage measurement for Python"
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -209,6 +202,7 @@ toml = ["tomli"]
 name = "decorator"
 version = "5.1.1"
 description = "Decorators for Humans"
+category = "dev"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -220,6 +214,7 @@ files = [
 name = "duckdb"
 version = "0.8.1"
 description = "DuckDB embedded database"
+category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -281,6 +276,7 @@ files = [
 name = "duckdb-engine"
 version = "0.9.0"
 description = "SQLAlchemy driver for duckdb"
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -297,6 +293,7 @@ sqlalchemy = ">=1.3.22"
 name = "exceptiongroup"
 version = "1.1.0"
 description = "Backport of PEP 654 (exception groups)"
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -311,6 +308,7 @@ test = ["pytest (>=6)"]
 name = "executing"
 version = "1.2.0"
 description = "Get the currently executing AST node of a frame, and other information"
+category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -325,6 +323,7 @@ tests = ["asttokens", "littleutils", "pytest", "rich"]
 name = "greenlet"
 version = "2.0.1"
 description = "Lightweight in-process concurrent programming"
+category = "dev"
 optional = false
 python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
 files = [
@@ -398,6 +397,7 @@ test = ["faulthandler", "objgraph", "psutil"]
 name = "ibis-framework"
 version = "4.0.0"
 description = "Productivity-centric Python Big Data Framework"
+category = "main"
 optional = false
 python-versions = ">=3.8,<4.0"
 files = [
@@ -442,6 +442,7 @@ visualization = ["graphviz (>=0.16,<1)"]
 name = "importlib-metadata"
 version = "6.0.0"
 description = "Read metadata from Python packages"
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -461,6 +462,7 @@ testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packag
 name = "iniconfig"
 version = "2.0.0"
 description = "brain-dead simple config-ini parsing"
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -472,6 +474,7 @@ files = [
 name = "ipython"
 version = "8.12.2"
 description = "IPython: Productive Interactive Computing"
+category = "dev"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -511,6 +514,7 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pa
 name = "jedi"
 version = "0.18.2"
 description = "An autocompletion tool for Python that can be used for text editors."
+category = "dev"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -530,6 +534,7 @@ testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"]
 name = "markdown-it-py"
 version = "2.1.0"
 description = "Python port of markdown-it. Markdown parsing, done right!"
+category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -554,6 +559,7 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
 name = "matplotlib-inline"
 version = "0.1.6"
 description = "Inline Matplotlib backend for Jupyter"
+category = "dev"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -568,6 +574,7 @@ traitlets = "*"
 name = "mdurl"
 version = "0.1.2"
 description = "Markdown URL utilities"
+category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -579,6 +586,7 @@ files = [
 name = "multipledispatch"
 version = "0.6.0"
 description = "Multiple dispatch"
+category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -594,6 +602,7 @@ six = "*"
 name = "mypy"
 version = "1.4.1"
 description = "Optional static typing for Python"
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -640,6 +649,7 @@ reports = ["lxml"]
 name = "mypy-extensions"
 version = "1.0.0"
 description = "Type system extensions for programs checked with the mypy type checker."
+category = "dev"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -651,6 +661,7 @@ files = [
 name = "mypy-protobuf"
 version = "3.3.0"
 description = "Generate mypy stub files from protobuf specs"
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -666,6 +677,7 @@ types-protobuf = ">=3.19.12"
 name = "numpy"
 version = "1.24.1"
 description = "Fundamental package for array computing in Python"
+category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -703,6 +715,7 @@ files = [
 name = "packaging"
 version = "23.1"
 description = "Core utilities for Python packages"
+category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -714,6 +727,7 @@ files = [
 name = "pandas"
 version = "1.5.3"
 description = "Powerful data structures for data analysis, time series, and statistics"
+category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -762,6 +776,7 @@ test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"]
 name = "parso"
 version = "0.8.3"
 description = "A Python Parser"
+category = "dev"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -777,6 +792,7 @@ testing = ["docopt", "pytest (<6.0.0)"]
 name = "parsy"
 version = "2.0"
 description = "easy-to-use parser combinators, for parsing in pure Python"
+category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -788,6 +804,7 @@ files = [
 name = "pathspec"
 version = "0.11.0"
 description = "Utility library for gitignore style pattern matching of file paths."
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -799,6 +816,7 @@ files = [
 name = "pexpect"
 version = "4.8.0"
 description = "Pexpect allows easy control of interactive console applications."
+category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -813,6 +831,7 @@ ptyprocess = ">=0.5"
 name = "pickleshare"
 version = "0.7.5"
 description = "Tiny 'shelve'-like database with concurrency support"
+category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -824,6 +843,7 @@ files = [
 name = "platformdirs"
 version = "2.6.2"
 description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -839,6 +859,7 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2)", "pytest-
 name = "pluggy"
 version = "1.0.0"
 description = "plugin and hook calling mechanisms for python"
+category = "dev"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -854,6 +875,7 @@ testing = ["pytest", "pytest-benchmark"]
 name = "pprintpp"
 version = "0.4.0"
 description = "A drop-in replacement for pprint that's actually pretty"
+category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -865,6 +887,7 @@ files = [
 name = "prompt-toolkit"
 version = "3.0.36"
 description = "Library for building powerful interactive command lines in Python"
+category = "dev"
 optional = false
 python-versions = ">=3.6.2"
 files = [
@@ -879,6 +902,7 @@ wcwidth = "*"
 name = "protobuf"
 version = "3.20.1"
 description = "Protocol Buffers"
+category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -908,29 +932,11 @@ files = [
     {file = "protobuf-3.20.1.tar.gz", hash = "sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9"},
 ]
 
-[[package]]
-name = "protoletariat"
-version = "3.2.11"
-description = "Python protocol buffers for the rest of us"
-optional = false
-python-versions = ">=3.8,<4.0"
-files = [
-    {file = "protoletariat-3.2.11-py3-none-any.whl", hash = "sha256:007c8b6b88815db17679b3201bd7f2d472fd35ecbc2a17598848b884aaa0df32"},
-    {file = "protoletariat-3.2.11.tar.gz", hash = "sha256:768b2616c51acca850c9c4a405242940cfd3f1f17972e254458a510511a3b0f4"},
-]
-
-[package.dependencies]
-astunparse = {version = ">=1.6.3,<2", markers = "python_version < \"3.9\""}
-click = ">=8,<9"
-protobuf = ">=3.19.1,<5"
-
-[package.extras]
-grpcio-tools = ["grpcio-tools (>=1.42.0,<2)"]
-
 [[package]]
 name = "ptyprocess"
 version = "0.7.0"
 description = "Run a subprocess in a pseudo terminal"
+category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -942,6 +948,7 @@ files = [
 name = "pure-eval"
 version = "0.2.2"
 description = "Safely evaluate AST nodes without side effects"
+category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -956,6 +963,7 @@ tests = ["pytest"]
 name = "pyarrow"
 version = "12.0.1"
 description = "Python library for Apache Arrow"
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -993,6 +1001,7 @@ numpy = ">=1.16.6"
 name = "pygments"
 version = "2.14.0"
 description = "Pygments is a syntax highlighting package written in Python."
+category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1007,6 +1016,7 @@ plugins = ["importlib-metadata"]
 name = "pytest"
 version = "7.4.0"
 description = "pytest: simple powerful testing with Python"
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1029,6 +1039,7 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no
 name = "pytest-clarity"
 version = "1.0.1"
 description = "A plugin providing an alternative, colourful diff output for failing assertions."
+category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 files = [
@@ -1044,6 +1055,7 @@ rich = ">=8.0.0"
 name = "pytest-cov"
 version = "4.1.0"
 description = "Pytest plugin for measuring coverage."
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1062,6 +1074,7 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale
 name = "pytest-lazy-fixture"
 version = "0.6.3"
 description = "It helps to use fixtures in pytest.mark.parametrize"
+category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -1076,6 +1089,7 @@ pytest = ">=3.2.5"
 name = "pytest-mock"
 version = "3.11.1"
 description = "Thin-wrapper around the mock package for easier use with pytest"
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1093,6 +1107,7 @@ dev = ["pre-commit", "pytest-asyncio", "tox"]
 name = "pytest-randomly"
 version = "3.12.0"
 description = "Pytest plugin to randomly order tests and control random.seed."
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1108,6 +1123,7 @@ pytest = "*"
 name = "pytest-snapshot"
 version = "0.9.0"
 description = "A plugin for snapshot testing with pytest."
+category = "dev"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -1122,6 +1138,7 @@ pytest = ">=3.0.0"
 name = "python-dateutil"
 version = "2.8.2"
 description = "Extensions to the standard Python datetime module"
+category = "main"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
 files = [
@@ -1136,6 +1153,7 @@ six = ">=1.5"
 name = "pytz"
 version = "2022.7.1"
 description = "World timezone definitions, modern and historical"
+category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -1147,6 +1165,7 @@ files = [
 name = "pyyaml"
 version = "6.0"
 description = "YAML parser and emitter for Python"
+category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1196,6 +1215,7 @@ files = [
 name = "rich"
 version = "13.2.0"
 description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
+category = "main"
 optional = false
 python-versions = ">=3.7.0"
 files = [
@@ -1206,7 +1226,6 @@ files = [
 [package.dependencies]
 markdown-it-py = ">=2.1.0,<3.0.0"
 pygments = ">=2.6.0,<3.0.0"
-typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""}
 
 [package.extras]
 jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"]
@@ -1215,6 +1234,7 @@ jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"]
 name = "ruff"
 version = "0.0.275"
 description = "An extremely fast Python linter, written in Rust."
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1241,6 +1261,7 @@ files = [
 name = "setuptools"
 version = "68.0.0"
 description = "Easily download, build, install, upgrade, and uninstall Python packages"
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1257,6 +1278,7 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (
 name = "six"
 version = "1.16.0"
 description = "Python 2 and 3 compatibility utilities"
+category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
 files = [
@@ -1268,6 +1290,7 @@ files = [
 name = "sqlalchemy"
 version = "1.4.48"
 description = "Database Abstraction Library"
+category = "dev"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
 files = [
@@ -1315,7 +1338,7 @@ files = [
 ]
 
 [package.dependencies]
-greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\")"}
+greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"}
 
 [package.extras]
 aiomysql = ["aiomysql", "greenlet (!=0.4.17)"]
@@ -1342,6 +1365,7 @@ sqlcipher = ["sqlcipher3-binary"]
 name = "sqlglot"
 version = "10.5.6"
 description = "An easily customizable SQL parser and transpiler"
+category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -1356,6 +1380,7 @@ dev = ["autoflake", "black", "duckdb", "isort", "mypy (>=0.990)", "pandas", "pdo
 name = "stack-data"
 version = "0.6.2"
 description = "Extract data from python stack frames and tracebacks for informative displays"
+category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -1371,10 +1396,30 @@ pure-eval = "*"
 [package.extras]
 tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"]
 
+[[package]]
+name = "substrait"
+version = "0.2.1"
+description = "A python package for Substrait."
+category = "main"
+optional = false
+python-versions = ">=3.8.1"
+files = [
+    {file = "substrait-0.2.1-py3-none-any.whl", hash = "sha256:fe721349caf3dd2f6ab281f55d1c6f9fbb809eb227c8d08fbd6e4c967982eb2e"},
+    {file = "substrait-0.2.1.tar.gz", hash = "sha256:ff2c1ecfdd2af897170a8405ae1108eb0e98db000cda779568400fba4bbd6ece"},
+]
+
+[package.dependencies]
+protobuf = ">=3.20"
+
+[package.extras]
+gen-proto = ["protobuf (==3.20.1)", "protoletariat (>=2.0.0)"]
+test = ["pytest (>=7.0.0)"]
+
 [[package]]
 name = "tomli"
 version = "2.0.1"
 description = "A lil' TOML parser"
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1386,6 +1431,7 @@ files = [
 name = "toolz"
 version = "0.12.0"
 description = "List processing tools and functional utilities"
+category = "main"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -1397,6 +1443,7 @@ files = [
 name = "traitlets"
 version = "5.8.1"
 description = "Traitlets Python configuration system"
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1412,6 +1459,7 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"]
 name = "types-protobuf"
 version = "3.20.4.6"
 description = "Typing stubs for protobuf"
+category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -1423,6 +1471,7 @@ files = [
 name = "types-pytz"
 version = "2023.3.0.0"
 description = "Typing stubs for pytz"
+category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -1434,6 +1483,7 @@ files = [
 name = "types-pyyaml"
 version = "6.0.12.10"
 description = "Typing stubs for PyYAML"
+category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -1445,6 +1495,7 @@ files = [
 name = "typing-extensions"
 version = "4.4.0"
 description = "Backported and Experimental Type Hints for Python 3.7+"
+category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1456,6 +1507,7 @@ files = [
 name = "wcwidth"
 version = "0.2.6"
 description = "Measures the displayed width of unicode strings in a terminal"
+category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -1463,24 +1515,11 @@ files = [
     {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"},
 ]
 
-[[package]]
-name = "wheel"
-version = "0.38.4"
-description = "A built-package format for Python"
-optional = false
-python-versions = ">=3.7"
-files = [
-    {file = "wheel-0.38.4-py3-none-any.whl", hash = "sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8"},
-    {file = "wheel-0.38.4.tar.gz", hash = "sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac"},
-]
-
-[package.extras]
-test = ["pytest (>=3.0.0)"]
-
 [[package]]
 name = "zipp"
 version = "3.11.0"
 description = "Backport of pathlib-compatible object wrapper for zip files"
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1494,5 +1533,5 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools"
 
 [metadata]
 lock-version = "2.0"
-python-versions = ">=3.8.1,<4"
-content-hash = "5625850d19610e1a545ab41e800ef1564c43d5b7c9e0e87fc261506d33cd207b"
+python-versions = ">=3.9,<4"
+content-hash = "cdf62466879cff2b8aedf559248fcc23c71acdc77ba259f83ad96fb24aebfd11"
diff --git a/proto/buf.lock b/proto/buf.lock
deleted file mode 100644
index c91b5810..00000000
--- a/proto/buf.lock
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by buf. DO NOT EDIT.
-version: v1
diff --git a/proto/buf.yaml b/proto/buf.yaml
deleted file mode 100644
index d346b377..00000000
--- a/proto/buf.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-version: v1
-name: buf.build/substrait/substrait
-lint:
-  use:
-    - DEFAULT
-  ignore_only:
-    PACKAGE_VERSION_SUFFIX:
-      - substrait
-breaking:
-  use:
-    - FILE
diff --git a/proto/substrait/algebra.proto b/proto/substrait/algebra.proto
deleted file mode 100644
index bb51965b..00000000
--- a/proto/substrait/algebra.proto
+++ /dev/null
@@ -1,1295 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-syntax = "proto3";
-
-package substrait;
-
-import "google/protobuf/any.proto";
-import "substrait/extensions/extensions.proto";
-import "substrait/type.proto";
-
-option csharp_namespace = "Substrait.Protobuf";
-option go_package = "github.com/substrait-io/substrait-go/proto";
-option java_multiple_files = true;
-option java_package = "io.substrait.proto";
-
-// Common fields for all relational operators
-message RelCommon {
-  oneof emit_kind {
-    // The underlying relation is output as is (no reordering or projection of columns)
-    Direct direct = 1;
-    // Allows to control for order and inclusion of fields
-    Emit emit = 2;
-  }
-
-  Hint hint = 3;
-  substrait.extensions.AdvancedExtension advanced_extension = 4;
-
-  // Direct indicates no change on presence and ordering of fields in the output
-  message Direct {}
-
-  // Remap which fields are output and in which order
-  message Emit {
-    repeated int32 output_mapping = 1;
-  }
-
-  // Changes to the operation that can influence efficiency/performance but
-  // should not impact correctness.
-  message Hint {
-    Stats stats = 1;
-    RuntimeConstraint constraint = 2;
-    substrait.extensions.AdvancedExtension advanced_extension = 10;
-
-    // The statistics related to a hint (physical properties of records)
-    message Stats {
-      double row_count = 1;
-      double record_size = 2;
-      substrait.extensions.AdvancedExtension advanced_extension = 10;
-    }
-
-    message RuntimeConstraint {
-      // TODO: nodes, cpu threads/%, memory, iops, etc.
-
-      substrait.extensions.AdvancedExtension advanced_extension = 10;
-    }
-  }
-}
-
-// The scan operator of base data (physical or virtual), including filtering and projection.
-message ReadRel {
-  RelCommon common = 1;
-  NamedStruct base_schema = 2;
-  Expression filter = 3;
-  Expression best_effort_filter = 11;
-  Expression.MaskExpression projection = 4;
-  substrait.extensions.AdvancedExtension advanced_extension = 10;
-
-  // Definition of which type of scan operation is to be performed
-  oneof read_type {
-    VirtualTable virtual_table = 5;
-    LocalFiles local_files = 6;
-    NamedTable named_table = 7;
-    ExtensionTable extension_table = 8;
-  }
-
-  // A base table. The list of string is used to represent namespacing (e.g., mydb.mytable).
-  // This assumes shared catalog between systems exchanging a message.
-  message NamedTable {
-    repeated string names = 1;
-    substrait.extensions.AdvancedExtension advanced_extension = 10;
-  }
-
-  // A table composed of literals.
-  message VirtualTable {
-    repeated Expression.Literal.Struct values = 1;
-  }
-
-  // A stub type that can be used to extend/introduce new table types outside
-  // the specification.
-  message ExtensionTable {
-    google.protobuf.Any detail = 1;
-  }
-
-  // Represents a list of files in input of a scan operation
-  message LocalFiles {
-    repeated FileOrFiles items = 1;
-    substrait.extensions.AdvancedExtension advanced_extension = 10;
-
-    // Many files consist of indivisible chunks (e.g. parquet row groups
-    // or CSV rows).  If a slice partially selects an indivisible chunk
-    // then the consumer should employ some rule to decide which slice to
-    // include the chunk in (e.g. include it in the slice that contains
-    // the midpoint of the chunk)
-    message FileOrFiles {
-      oneof path_type {
-        // A URI that can refer to either a single folder or a single file
-        string uri_path = 1;
-        // A URI where the path portion is a glob expression that can
-        // identify zero or more paths.
-        // Consumers should support the POSIX syntax.  The recursive
-        // globstar (**) may not be supported.
-        string uri_path_glob = 2;
-        // A URI that refers to a single file
-        string uri_file = 3;
-        // A URI that refers to a single folder
-        string uri_folder = 4;
-      }
-
-      // Original file format enum, superseded by the file_format oneof.
-      reserved 5;
-      reserved "format";
-
-      // The index of the partition this item belongs to
-      uint64 partition_index = 6;
-
-      // The start position in byte to read from this item
-      uint64 start = 7;
-
-      // The length in byte to read from this item
-      uint64 length = 8;
-
-      message ParquetReadOptions {}
-      message ArrowReadOptions {}
-      message OrcReadOptions {}
-      message DwrfReadOptions {}
-
-      // The format of the files.
-      oneof file_format {
-        ParquetReadOptions parquet = 9;
-        ArrowReadOptions arrow = 10;
-        OrcReadOptions orc = 11;
-        google.protobuf.Any extension = 12;
-        DwrfReadOptions dwrf = 13;
-      }
-    }
-  }
-}
-
-// This operator allows to represent calculated expressions of fields (e.g., a+b). Direct/Emit are used to represent classical relational projections
-message ProjectRel {
-  RelCommon common = 1;
-  Rel input = 2;
-  repeated Expression expressions = 3;
-  substrait.extensions.AdvancedExtension advanced_extension = 10;
-}
-
-// The binary JOIN relational operator left-join-right, including various join types, a join condition and post_join_filter expression
-message JoinRel {
-  RelCommon common = 1;
-  Rel left = 2;
-  Rel right = 3;
-  Expression expression = 4;
-  Expression post_join_filter = 5;
-
-  JoinType type = 6;
-
-  enum JoinType {
-    JOIN_TYPE_UNSPECIFIED = 0;
-    JOIN_TYPE_INNER = 1;
-    JOIN_TYPE_OUTER = 2;
-    JOIN_TYPE_LEFT = 3;
-    JOIN_TYPE_RIGHT = 4;
-    JOIN_TYPE_SEMI = 5;
-    JOIN_TYPE_ANTI = 6;
-    // This join is useful for nested sub-queries where we need exactly one tuple in output (or throw exception)
-    // See Section 3.2 of https://15721.courses.cs.cmu.edu/spring2018/papers/16-optimizer2/hyperjoins-btw2017.pdf
-    JOIN_TYPE_SINGLE = 7;
-  }
-
-  substrait.extensions.AdvancedExtension advanced_extension = 10;
-}
-
-// Cartesian product relational operator of two tables (left and right)
-message CrossRel {
-  RelCommon common = 1;
-  Rel left = 2;
-  Rel right = 3;
-
-  substrait.extensions.AdvancedExtension advanced_extension = 10;
-}
-
-// The relational operator representing LIMIT/OFFSET or TOP type semantics.
-message FetchRel {
-  RelCommon common = 1;
-  Rel input = 2;
-  // the offset expressed in number of records
-  int64 offset = 3;
-  // the amount of records to return
-  int64 count = 4;
-  substrait.extensions.AdvancedExtension advanced_extension = 10;
-}
-
-// The relational operator representing a GROUP BY Aggregate
-message AggregateRel {
-  RelCommon common = 1;
-
-  // Input of the aggregation
-  Rel input = 2;
-
-  // A list of expression grouping that the aggregation measured should be calculated for.
-  repeated Grouping groupings = 3;
-
-  // A list of one or more aggregate expressions along with an optional filter.
-  repeated Measure measures = 4;
-
-  substrait.extensions.AdvancedExtension advanced_extension = 10;
-
-  message Grouping {
-    repeated Expression grouping_expressions = 1;
-  }
-
-  message Measure {
-    AggregateFunction measure = 1;
-
-    // An optional boolean expression that acts to filter which records are
-    // included in the measure. True means include this record for calculation
-    // within the measure.
-    // Helps to support SUM(<c>) FILTER(WHERE...) syntax without masking opportunities for optimization
-    Expression filter = 2;
-  }
-}
-
-// The ORDERY BY (or sorting) relational operator. Beside describing a base relation, it includes a list of fields to sort on
-message SortRel {
-  RelCommon common = 1;
-  Rel input = 2;
-  repeated SortField sorts = 3;
-  substrait.extensions.AdvancedExtension advanced_extension = 10;
-}
-
-// The relational operator capturing simple FILTERs (as in the WHERE clause of SQL)
-message FilterRel {
-  RelCommon common = 1;
-  Rel input = 2;
-  Expression condition = 3;
-  substrait.extensions.AdvancedExtension advanced_extension = 10;
-}
-
-// The relational set operators (intersection/union/etc..)
-message SetRel {
-  RelCommon common = 1;
-  // The first input is the primary input, the remaining are secondary
-  // inputs.  There must be at least two inputs.
-  repeated Rel inputs = 2;
-  SetOp op = 3;
-  substrait.extensions.AdvancedExtension advanced_extension = 10;
-
-  enum SetOp {
-    SET_OP_UNSPECIFIED = 0;
-    SET_OP_MINUS_PRIMARY = 1;
-    SET_OP_MINUS_MULTISET = 2;
-    SET_OP_INTERSECTION_PRIMARY = 3;
-    SET_OP_INTERSECTION_MULTISET = 4;
-    SET_OP_UNION_DISTINCT = 5;
-    SET_OP_UNION_ALL = 6;
-  }
-}
-
-// Stub to support extension with a single input
-message ExtensionSingleRel {
-  RelCommon common = 1;
-  Rel input = 2;
-  google.protobuf.Any detail = 3;
-}
-
-// Stub to support extension with a zero inputs
-message ExtensionLeafRel {
-  RelCommon common = 1;
-  google.protobuf.Any detail = 2;
-}
-
-// Stub to support extension with multiple inputs
-message ExtensionMultiRel {
-  RelCommon common = 1;
-  repeated Rel inputs = 2;
-  google.protobuf.Any detail = 3;
-}
-
-// A redistribution operation
-message ExchangeRel {
-  RelCommon common = 1;
-  Rel input = 2;
-  int32 partition_count = 3;
-  repeated ExchangeTarget targets = 4;
-
-  // the type of exchange used
-  oneof exchange_kind {
-    ScatterFields scatter_by_fields = 5;
-    SingleBucketExpression single_target = 6;
-    MultiBucketExpression multi_target = 7;
-    RoundRobin round_robin = 8;
-    Broadcast broadcast = 9;
-  }
-
-  substrait.extensions.AdvancedExtension advanced_extension = 10;
-
-  message ScatterFields {
-    repeated Expression.FieldReference fields = 1;
-  }
-
-  // Returns a single bucket number per record.
-  message SingleBucketExpression {
-    Expression expression = 1;
-  }
-
-  // Returns zero or more bucket numbers per record
-  message MultiBucketExpression {
-    Expression expression = 1;
-    bool constrained_to_count = 2;
-  }
-
-  // Send all data to every target.
-  message Broadcast {}
-
-  // Route approximately
-  message RoundRobin {
-    // whether the round robin behavior is required to exact (per record) or
-    // approximate. Defaults to approximate.
-    bool exact = 1;
-  }
-
-  // The message to describe partition targets of an exchange
-  message ExchangeTarget {
-    // Describes the partition id(s) to send. If this is empty, all data is sent
-    // to this target.
-    repeated int32 partition_id = 1;
-
-    oneof target_type {
-      string uri = 2;
-      google.protobuf.Any extended = 3;
-    }
-  }
-}
-
-// A relation with output field names.
-//
-// This is for use at the root of a `Rel` tree.
-message RelRoot {
-  // A relation
-  Rel input = 1;
-  // Field names in depth-first order
-  repeated string names = 2;
-}
-
-// A relation (used internally in a plan)
-message Rel {
-  oneof rel_type {
-    ReadRel read = 1;
-    FilterRel filter = 2;
-    FetchRel fetch = 3;
-    AggregateRel aggregate = 4;
-    SortRel sort = 5;
-    JoinRel join = 6;
-    ProjectRel project = 7;
-    SetRel set = 8;
-    ExtensionSingleRel extension_single = 9;
-    ExtensionMultiRel extension_multi = 10;
-    ExtensionLeafRel extension_leaf = 11;
-    CrossRel cross = 12;
-
-    //Physical relations
-    HashJoinRel hash_join = 13;
-    MergeJoinRel merge_join = 14;
-  }
-}
-
-// A base object for writing (e.g., a table or a view).
-message NamedObjectWrite {
-  // The list of string is used to represent namespacing (e.g., mydb.mytable).
-  // This assumes shared catalog between systems exchanging a message.
-  repeated string names = 1;
-  substrait.extensions.AdvancedExtension advanced_extension = 10;
-}
-
-// A stub type that can be used to extend/introduce new table types outside
-// the specification.
-message ExtensionObject {
-  google.protobuf.Any detail = 1;
-}
-
-message DdlRel {
-  // Definition of which type of object we are operating on
-  oneof write_type {
-    NamedObjectWrite named_object = 1;
-    ExtensionObject extension_object = 2;
-  }
-
-  // The columns that will be modified (representing after-image of a schema change)
-  NamedStruct table_schema = 3;
-  // The default values for the columns (representing after-image of a schema change)
-  // E.g., in case of an ALTER TABLE that changes some of the column default values, we expect
-  // the table_defaults Struct to report a full list of default values reflecting the result of applying
-  // the ALTER TABLE operator successfully
-  Expression.Literal.Struct table_defaults = 4;
-
-  // Which type of object we operate on
-  DdlObject object = 5;
-
-  // The type of operation to perform
-  DdlOp op = 6;
-
-  // The body of the CREATE VIEW
-  Rel view_definition = 7;
-
-  enum DdlObject {
-    DDL_OBJECT_UNSPECIFIED = 0;
-    // A Table object in the system
-    DDL_OBJECT_TABLE = 1;
-    // A View object in the system
-    DDL_OBJECT_VIEW = 2;
-  }
-
-  enum DdlOp {
-    DDL_OP_UNSPECIFIED = 0;
-    // A create operation (for any object)
-    DDL_OP_CREATE = 1;
-    // A create operation if the object does not exist, or replaces it (equivalent to a DROP + CREATE) if the object already exists
-    DDL_OP_CREATE_OR_REPLACE = 2;
-    // An operation that modifies the schema (e.g., column names, types, default values) for the target object
-    DDL_OP_ALTER = 3;
-    // An operation that removes an object from the system
-    DDL_OP_DROP = 4;
-    // An operation that removes an object from the system (without throwing an exception if the object did not exist)
-    DDL_OP_DROP_IF_EXIST = 5;
-  }
-  //TODO add PK/constraints/indexes/etc..?
-}
-
-// The operator that modifies the content of a database (operates on 1 table at a time, but tuple-selection/source can be
-// based on joining of multiple tables).
-message WriteRel {
-  // Definition of which TABLE we are operating on
-  oneof write_type {
-    NamedObjectWrite named_table = 1;
-    ExtensionObject extension_table = 2;
-  }
-
-  // The schema of the table (must align with Rel input (e.g., number of leaf fields must match))
-  NamedStruct table_schema = 3;
-
-  // The type of operation to perform
-  WriteOp op = 4;
-
-  // The relation that determines the tuples to add/remove/modify
-  // the schema must match with table_schema. Default values must be explicitly stated
-  // in a ProjectRel at the top of the input. The match must also
-  // occur in case of DELETE to ensure multi-engine plans are unequivocal.
-  Rel input = 5;
-
-  // Output mode determines what is the output of executing this rel
-  OutputMode output = 6;
-
-  enum WriteOp {
-    WRITE_OP_UNSPECIFIED = 0;
-    // The insert of new tuples in a table
-    WRITE_OP_INSERT = 1;
-    // The removal of tuples from a table
-    WRITE_OP_DELETE = 2;
-    // The modification of existing tuples within a table
-    WRITE_OP_UPDATE = 3;
-    // The Creation of a new table, and the insert of new tuples in the table
-    WRITE_OP_CTAS = 4;
-  }
-
-  enum OutputMode {
-    OUTPUT_MODE_UNSPECIFIED = 0;
-    // return no tuples at all
-    OUTPUT_MODE_NO_OUTPUT = 1;
-    // this mode makes the operator return all the tuple INSERTED/DELETED/UPDATED by the operator.
-    // The operator returns the AFTER-image of any change. This can be further manipulated by operators upstreams
-    // (e.g., retunring the typical "count of modified tuples").
-    // For scenarios in which the BEFORE image is required, the user must implement a spool (via references to
-    // subplans in the body of the Rel input) and return those with anounter PlanRel.relations.
-    OUTPUT_MODE_MODIFIED_TUPLES = 2;
-  }
-}
-
-// The hash equijoin join operator will build a hash table out of the right input based on a set of join keys.
-// It will then probe that hash table for incoming inputs, finding matches.
-message HashJoinRel {
-  RelCommon common = 1;
-  Rel left = 2;
-  Rel right = 3;
-  repeated Expression.FieldReference left_keys = 4;
-  repeated Expression.FieldReference right_keys = 5;
-  Expression post_join_filter = 6;
-
-  JoinType type = 7;
-
-  enum JoinType {
-    JOIN_TYPE_UNSPECIFIED = 0;
-    JOIN_TYPE_INNER = 1;
-    JOIN_TYPE_OUTER = 2;
-    JOIN_TYPE_LEFT = 3;
-    JOIN_TYPE_RIGHT = 4;
-    JOIN_TYPE_LEFT_SEMI = 5;
-    JOIN_TYPE_RIGHT_SEMI = 6;
-    JOIN_TYPE_LEFT_ANTI = 7;
-    JOIN_TYPE_RIGHT_ANTI = 8;
-  }
-
-  substrait.extensions.AdvancedExtension advanced_extension = 10;
-}
-
-// The merge equijoin does a join by taking advantage of two sets that are sorted on the join keys.
-// This allows the join operation to be done in a streaming fashion.
-message MergeJoinRel {
-  RelCommon common = 1;
-  Rel left = 2;
-  Rel right = 3;
-  repeated Expression.FieldReference left_keys = 4;
-  repeated Expression.FieldReference right_keys = 5;
-  Expression post_join_filter = 6;
-
-  JoinType type = 7;
-
-  enum JoinType {
-    JOIN_TYPE_UNSPECIFIED = 0;
-    JOIN_TYPE_INNER = 1;
-    JOIN_TYPE_OUTER = 2;
-    JOIN_TYPE_LEFT = 3;
-    JOIN_TYPE_RIGHT = 4;
-    JOIN_TYPE_LEFT_SEMI = 5;
-    JOIN_TYPE_RIGHT_SEMI = 6;
-    JOIN_TYPE_LEFT_ANTI = 7;
-    JOIN_TYPE_RIGHT_ANTI = 8;
-  }
-
-  substrait.extensions.AdvancedExtension advanced_extension = 10;
-}
-
-// The argument of a function
-message FunctionArgument {
-  oneof arg_type {
-    string enum = 1;
-    Type type = 2;
-    Expression value = 3;
-  }
-}
-
-// An optional function argument.  Typically used for specifying behavior in
-// invalid or corner cases.
-message FunctionOption {
-  // Name of the option to set. If the consumer does not recognize the
-  // option, it must reject the plan. The name is matched case-insensitively
-  // with option names defined for the function.
-  string name = 1;
-
-  // List of behavior options allowed by the producer. At least one must be
-  // specified; to leave an option unspecified, simply don't add an entry to
-  // `options`. The consumer must use the first option from the list that it
-  // supports. If the consumer supports none of the specified options, it
-  // must reject the plan. The name is matched case-insensitively and must
-  // match one of the option values defined for the option.
-  repeated string preference = 2;
-}
-
-message Expression {
-  oneof rex_type {
-    Literal literal = 1;
-    FieldReference selection = 2;
-    ScalarFunction scalar_function = 3;
-    WindowFunction window_function = 5;
-    IfThen if_then = 6;
-    SwitchExpression switch_expression = 7;
-    SingularOrList singular_or_list = 8;
-    MultiOrList multi_or_list = 9;
-    Cast cast = 11;
-    Subquery subquery = 12;
-    Nested nested = 13;
-
-    // deprecated: enum literals are only sensible in the context of
-    // function arguments, for which FunctionArgument should now be
-    // used
-    Enum enum = 10 [deprecated = true];
-  }
-
-  message Enum {
-    option deprecated = true;
-
-    oneof enum_kind {
-      string specified = 1;
-      Empty unspecified = 2;
-    }
-
-    message Empty {
-      option deprecated = true;
-    }
-  }
-
-  message Literal {
-    oneof literal_type {
-      bool boolean = 1;
-      int32 i8 = 2;
-      int32 i16 = 3;
-      int32 i32 = 5;
-      int64 i64 = 7;
-      float fp32 = 10;
-      double fp64 = 11;
-      string string = 12;
-      bytes binary = 13;
-      // Timestamp in units of microseconds since the UNIX epoch.
-      int64 timestamp = 14;
-      // Date in units of days since the UNIX epoch.
-      int32 date = 16;
-      // Time in units of microseconds past midnight
-      int64 time = 17;
-      IntervalYearToMonth interval_year_to_month = 19;
-      IntervalDayToSecond interval_day_to_second = 20;
-      string fixed_char = 21;
-      VarChar var_char = 22;
-      bytes fixed_binary = 23;
-      Decimal decimal = 24;
-      Struct struct = 25;
-      Map map = 26;
-      // Timestamp in units of microseconds since the UNIX epoch.
-      int64 timestamp_tz = 27;
-      bytes uuid = 28;
-      Type null = 29; // a typed null literal
-      List list = 30;
-      Type.List empty_list = 31;
-      Type.Map empty_map = 32;
-      UserDefined user_defined = 33;
-    }
-
-    // whether the literal type should be treated as a nullable type. Applies to
-    // all members of union other than the Typed null (which should directly
-    // declare nullability).
-    bool nullable = 50;
-
-    // optionally points to a type_variation_anchor defined in this plan.
-    // Applies to all members of union other than the Typed null (which should
-    // directly declare the type variation).
-    uint32 type_variation_reference = 51;
-
-    message VarChar {
-      string value = 1;
-      uint32 length = 2;
-    }
-
-    message Decimal {
-      // little-endian twos-complement integer representation of complete value
-      // (ignoring precision) Always 16 bytes in length
-      bytes value = 1;
-      // The maximum number of digits allowed in the value.
-      // the maximum precision is 38.
-      int32 precision = 2;
-      // declared scale of decimal literal
-      int32 scale = 3;
-    }
-
-    message Map {
-      message KeyValue {
-        Literal key = 1;
-        Literal value = 2;
-      }
-
-      repeated KeyValue key_values = 1;
-    }
-
-    message IntervalYearToMonth {
-      int32 years = 1;
-      int32 months = 2;
-    }
-
-    message IntervalDayToSecond {
-      int32 days = 1;
-      int32 seconds = 2;
-      int32 microseconds = 3;
-    }
-
-    message Struct {
-      // A possibly heterogeneously typed list of literals
-      repeated Literal fields = 1;
-    }
-
-    message List {
-      // A homogeneously typed list of literals
-      repeated Literal values = 1;
-    }
-
-    message UserDefined {
-      // points to a type_anchor defined in this plan
-      uint32 type_reference = 1;
-
-      // The parameters to be bound to the type class, if the type class is
-      // parameterizable.
-      repeated Type.Parameter type_parameters = 3;
-
-      // the value of the literal, serialized using some type-specific
-      // protobuf message
-      google.protobuf.Any value = 2;
-    }
-  }
-
-  // Expression to dynamically construct nested types.
-  message Nested {
-    // Whether the returned nested type is nullable.
-    bool nullable = 1;
-
-    // Optionally points to a type_variation_anchor defined in this plan for
-    // the returned nested type.
-    uint32 type_variation_reference = 2;
-
-    oneof nested_type {
-      Struct struct = 3;
-      List list = 4;
-      Map map = 5;
-    }
-
-    message Map {
-      message KeyValue {
-        // Mandatory key/value expressions.
-        Expression key = 1;
-        Expression value = 2;
-      }
-
-      // One or more key-value pairs. To specify an empty map, use
-      // Literal.empty_map (otherwise type information would be missing).
-      repeated KeyValue key_values = 1;
-    }
-
-    message Struct {
-      // Zero or more possibly heterogeneously-typed list of expressions that
-      // form the struct fields.
-      repeated Expression fields = 1;
-    }
-
-    message List {
-      // A homogeneously-typed list of one or more expressions that form the
-      // list entries. To specify an empty list, use Literal.empty_list
-      // (otherwise type information would be missing).
-      repeated Expression values = 1;
-    }
-  }
-
-  // A scalar function call.
-  message ScalarFunction {
-    // Points to a function_anchor defined in this plan, which must refer
-    // to a scalar function in the associated YAML file. Required; avoid
-    // using anchor/reference zero.
-    uint32 function_reference = 1;
-
-    // The arguments to be bound to the function. This must have exactly the
-    // number of arguments specified in the function definition, and the
-    // argument types must also match exactly:
-    //
-    //  - Value arguments must be bound using FunctionArgument.value, and
-    //    the expression in that must yield a value of a type that a function
-    //    overload is defined for.
-    //  - Type arguments must be bound using FunctionArgument.type.
-    //  - Enum arguments must be bound using FunctionArgument.enum
-    //    followed by Enum.specified, with a string that case-insensitively
-    //    matches one of the allowed options.
-    repeated FunctionArgument arguments = 4;
-
-    // Options to specify behavior for corner cases, or leave behavior
-    // unspecified if the consumer does not need specific behavior in these
-    // cases.
-    repeated FunctionOption options = 5;
-
-    // Must be set to the return type of the function, exactly as derived
-    // using the declaration in the extension.
-    Type output_type = 3;
-
-    // Deprecated; use arguments instead.
-    repeated Expression args = 2 [deprecated = true];
-  }
-
-  // A window function call.
-  message WindowFunction {
-    // Points to a function_anchor defined in this plan, which must refer
-    // to a window function in the associated YAML file. Required; 0 is
-    // considered to be a valid anchor/reference.
-    uint32 function_reference = 1;
-
-    // The arguments to be bound to the function. This must have exactly the
-    // number of arguments specified in the function definition, and the
-    // argument types must also match exactly:
-    //
-    //  - Value arguments must be bound using FunctionArgument.value, and
-    //    the expression in that must yield a value of a type that a function
-    //    overload is defined for.
-    //  - Type arguments must be bound using FunctionArgument.type, and a
-    //    function overload must be defined for that type.
-    //  - Enum arguments must be bound using FunctionArgument.enum
-    //    followed by Enum.specified, with a string that case-insensitively
-    //    matches one of the allowed options.
-    repeated FunctionArgument arguments = 9;
-
-    // Options to specify behavior for corner cases, or leave behavior
-    // unspecified if the consumer does not need specific behavior in these
-    // cases.
-    repeated FunctionOption options = 11;
-
-    // Must be set to the return type of the function, exactly as derived
-    // using the declaration in the extension.
-    Type output_type = 7;
-
-    // Describes which part of the window function to perform within the
-    // context of distributed algorithms. Required. Must be set to
-    // INITIAL_TO_RESULT for window functions that are not decomposable.
-    AggregationPhase phase = 6;
-
-    // If specified, the records that are part of the window defined by
-    // upper_bound and lower_bound are ordered according to this list
-    // before they are aggregated. The first sort field has the highest
-    // priority; only if a sort field determines two records to be equivalent
-    // is the next field queried. This field is optional, and is only allowed
-    // if the window function is defined to support sorting.
-    repeated SortField sorts = 3;
-
-    // Specifies whether equivalent records are merged before being aggregated.
-    // Optional, defaults to AGGREGATION_INVOCATION_ALL.
-    AggregateFunction.AggregationInvocation invocation = 10;
-
-    // When one or more partition expressions are specified, two records are
-    // considered to be in the same partition if and only if these expressions
-    // yield an equal tuple of values for both. When computing the window
-    // function, only the subset of records within the bounds that are also in
-    // the same partition as the current record are aggregated.
-    repeated Expression partitions = 2;
-
-    // Defines the record relative to the current record from which the window
-    // extends. The bound is inclusive. If the lower bound indexes a record
-    // greater than the upper bound, TODO (null range/no records passed?
-    // wrapping around as if lower/upper were swapped? error? null?).
-    // Optional; defaults to the start of the partition.
-    Bound lower_bound = 5;
-
-    // Defines the record relative to the current record up to which the window
-    // extends. The bound is inclusive. If the upper bound indexes a record
-    // less than the lower bound, TODO (null range/no records passed?
-    // wrapping around as if lower/upper were swapped? error? null?).
-    // Optional; defaults to the end of the partition.
-    Bound upper_bound = 4;
-
-    // Deprecated; use arguments instead.
-    repeated Expression args = 8 [deprecated = true];
-
-    // Defines one of the two boundaries for the window of a window function.
-    message Bound {
-      // Defines that the bound extends this far back from the current record.
-      message Preceding {
-        // A strictly positive integer specifying the number of records that
-        // the window extends back from the current record. Required. Use
-        // CurrentRow for offset zero and Following for negative offsets.
-        int64 offset = 1;
-      }
-
-      // Defines that the bound extends this far ahead of the current record.
-      message Following {
-        // A strictly positive integer specifying the number of records that
-        // the window extends ahead of the current record. Required. Use
-        // CurrentRow for offset zero and Preceding for negative offsets.
-        int64 offset = 1;
-      }
-
-      // Defines that the bound extends to or from the current record.
-      message CurrentRow {}
-
-      // Defines an "unbounded bound": for lower bounds this means the start
-      // of the partition, and for upper bounds this means the end of the
-      // partition.
-      message Unbounded {}
-
-      oneof kind {
-        // The bound extends some number of records behind the current record.
-        Preceding preceding = 1;
-
-        // The bound extends some number of records ahead of the current
-        // record.
-        Following following = 2;
-
-        // The bound extends to the current record.
-        CurrentRow current_row = 3;
-
-        // The bound extends to the start of the partition or the end of the
-        // partition, depending on whether this represents the upper or lower
-        // bound.
-        Unbounded unbounded = 4;
-      }
-    }
-  }
-
-  message IfThen {
-    repeated IfClause ifs = 1;
-    Expression else = 2;
-
-    message IfClause {
-      Expression if = 1;
-      Expression then = 2;
-    }
-  }
-
-  message Cast {
-    Type type = 1;
-    Expression input = 2;
-    FailureBehavior failure_behavior = 3;
-
-    enum FailureBehavior {
-      FAILURE_BEHAVIOR_UNSPECIFIED = 0;
-      FAILURE_BEHAVIOR_RETURN_NULL = 1;
-      FAILURE_BEHAVIOR_THROW_EXCEPTION = 2;
-    }
-  }
-
-  message SwitchExpression {
-    Expression match = 3;
-    repeated IfValue ifs = 1;
-    Expression else = 2;
-
-    message IfValue {
-      Literal if = 1;
-      Expression then = 2;
-    }
-  }
-
-  message SingularOrList {
-    Expression value = 1;
-    repeated Expression options = 2;
-  }
-
-  message MultiOrList {
-    repeated Expression value = 1;
-    repeated Record options = 2;
-
-    message Record {
-      repeated Expression fields = 1;
-    }
-  }
-
-  message EmbeddedFunction {
-    repeated Expression arguments = 1;
-    Type output_type = 2;
-    oneof kind {
-      PythonPickleFunction python_pickle_function = 3;
-      WebAssemblyFunction web_assembly_function = 4;
-    }
-
-    message PythonPickleFunction {
-      bytes function = 1;
-      repeated string prerequisite = 2;
-    }
-
-    message WebAssemblyFunction {
-      bytes script = 1;
-      repeated string prerequisite = 2;
-    }
-  }
-
-  // A way to reference the inner property of a complex record. Can reference
-  // either a map key by literal, a struct field by the ordinal position of
-  // the desired field or a particular element in an array. Supports
-  // expressions that would roughly translate to something similar to:
-  // a.b[2].c['my_map_key'].x where a,b,c and x are struct field references
-  // (ordinalized in the internal representation here), [2] is a list offset
-  // and ['my_map_key'] is a reference into a map field.
-  message ReferenceSegment {
-    oneof reference_type {
-      MapKey map_key = 1;
-      StructField struct_field = 2;
-      ListElement list_element = 3;
-    }
-
-    message MapKey {
-      // literal based reference to specific possible value in map.
-      Literal map_key = 1;
-
-      // Optional child segment
-      ReferenceSegment child = 2;
-    }
-
-    message StructField {
-      // zero-indexed ordinal position of field in struct
-      int32 field = 1;
-
-      // Optional child segment
-      ReferenceSegment child = 2;
-    }
-
-    message ListElement {
-      // zero-indexed ordinal position of element in list
-      int32 offset = 1;
-
-      // Optional child segment
-      ReferenceSegment child = 2;
-    }
-  }
-
-  // A reference that takes an existing subtype and selectively removes fields
-  // from it. For example, one might initially have an inner struct with 100
-  // fields but a a particular operation only needs to interact with only 2 of
-  // those 100 fields. In this situation, one would use a mask expression to
-  // eliminate the 98 fields that are not relevant to the rest of the operation
-  // pipeline.
-  //
-  // Note that this does not fundamentally alter the structure of data beyond
-  // the elimination of unecessary elements.
-  message MaskExpression {
-    StructSelect select = 1;
-    bool maintain_singular_struct = 2;
-
-    message Select {
-      oneof type {
-        StructSelect struct = 1;
-        ListSelect list = 2;
-        MapSelect map = 3;
-      }
-    }
-
-    message StructSelect {
-      repeated StructItem struct_items = 1;
-    }
-
-    message StructItem {
-      int32 field = 1;
-      Select child = 2;
-    }
-
-    message ListSelect {
-      repeated ListSelectItem selection = 1;
-      Select child = 2;
-
-      message ListSelectItem {
-        oneof type {
-          ListElement item = 1;
-          ListSlice slice = 2;
-        }
-
-        message ListElement {
-          int32 field = 1;
-        }
-
-        message ListSlice {
-          int32 start = 1;
-          int32 end = 2;
-        }
-      }
-    }
-
-    message MapSelect {
-      oneof select {
-        MapKey key = 1;
-        MapKeyExpression expression = 2;
-      }
-
-      Select child = 3;
-
-      message MapKey {
-        string map_key = 1;
-      }
-
-      message MapKeyExpression {
-        string map_key_expression = 1;
-      }
-    }
-  }
-
-  // A reference to an inner part of a complex object. Can reference reference a
-  // single element or a masked version of elements
-  message FieldReference {
-    // Whether this is composed of a single element reference or a masked
-    // element subtree
-    oneof reference_type {
-      ReferenceSegment direct_reference = 1;
-      MaskExpression masked_reference = 2;
-    }
-
-    // Whether this reference has an origin of a root struct or is based on the
-    // ouput of an expression. When this is a RootReference and direct_reference
-    // above is used, the direct_reference must be of a type StructField.
-    oneof root_type {
-      Expression expression = 3;
-      RootReference root_reference = 4;
-      OuterReference outer_reference = 5;
-    }
-
-    // Singleton that expresses this FieldReference is rooted off the root
-    // incoming record type
-    message RootReference {}
-
-    // A root reference for the outer relation's subquery
-    message OuterReference {
-      // number of subquery boundaries to traverse up for this field's reference
-      //
-      // This value must be >= 1
-      uint32 steps_out = 1;
-    }
-  }
-
-  // Subquery relation expression
-  message Subquery {
-    oneof subquery_type {
-      // Scalar subquery
-      Scalar scalar = 1;
-      // x IN y predicate
-      InPredicate in_predicate = 2;
-      // EXISTS/UNIQUE predicate
-      SetPredicate set_predicate = 3;
-      // ANY/ALL predicate
-      SetComparison set_comparison = 4;
-    }
-
-    // A subquery with one row and one column. This is often an aggregate
-    // though not required to be.
-    message Scalar {
-      Rel input = 1;
-    }
-
-    // Predicate checking that the left expression is contained in the right
-    // subquery
-    //
-    // Examples:
-    //
-    // x IN (SELECT * FROM t)
-    // (x, y) IN (SELECT a, b FROM t)
-    message InPredicate {
-      repeated Expression needles = 1;
-      Rel haystack = 2;
-    }
-
-    // A predicate over a set of rows in the form of a subquery
-    // EXISTS and UNIQUE are common SQL forms of this operation.
-    message SetPredicate {
-      enum PredicateOp {
-        PREDICATE_OP_UNSPECIFIED = 0;
-        PREDICATE_OP_EXISTS = 1;
-        PREDICATE_OP_UNIQUE = 2;
-      }
-      // TODO: should allow expressions
-      PredicateOp predicate_op = 1;
-      Rel tuples = 2;
-    }
-
-    // A subquery comparison using ANY or ALL.
-    // Examples:
-    //
-    // SELECT *
-    // FROM t1
-    // WHERE x < ANY(SELECT y from t2)
-    message SetComparison {
-      enum ComparisonOp {
-        COMPARISON_OP_UNSPECIFIED = 0;
-        COMPARISON_OP_EQ = 1;
-        COMPARISON_OP_NE = 2;
-        COMPARISON_OP_LT = 3;
-        COMPARISON_OP_GT = 4;
-        COMPARISON_OP_LE = 5;
-        COMPARISON_OP_GE = 6;
-      }
-
-      enum ReductionOp {
-        REDUCTION_OP_UNSPECIFIED = 0;
-        REDUCTION_OP_ANY = 1;
-        REDUCTION_OP_ALL = 2;
-      }
-
-      // ANY or ALL
-      ReductionOp reduction_op = 1;
-      // A comparison operator
-      ComparisonOp comparison_op = 2;
-      // left side of the expression
-      Expression left = 3;
-      // right side of the expression
-      Rel right = 4;
-    }
-  }
-}
-
-// The description of a field to sort on (including the direction of sorting and null semantics)
-message SortField {
-  Expression expr = 1;
-
-  oneof sort_kind {
-    SortDirection direction = 2;
-    uint32 comparison_function_reference = 3;
-  }
-  enum SortDirection {
-    SORT_DIRECTION_UNSPECIFIED = 0;
-    SORT_DIRECTION_ASC_NULLS_FIRST = 1;
-    SORT_DIRECTION_ASC_NULLS_LAST = 2;
-    SORT_DIRECTION_DESC_NULLS_FIRST = 3;
-    SORT_DIRECTION_DESC_NULLS_LAST = 4;
-    SORT_DIRECTION_CLUSTERED = 5;
-  }
-}
-
-// Describes which part of an aggregation or window function to perform within
-// the context of distributed algorithms.
-enum AggregationPhase {
-  // Implies `INTERMEDIATE_TO_RESULT`.
-  AGGREGATION_PHASE_UNSPECIFIED = 0;
-
-  // Specifies that the function should be run only up to the point of
-  // generating an intermediate value, to be further aggregated later using
-  // INTERMEDIATE_TO_INTERMEDIATE or INTERMEDIATE_TO_RESULT.
-  AGGREGATION_PHASE_INITIAL_TO_INTERMEDIATE = 1;
-
-  // Specifies that the inputs of the aggregate or window function are the
-  // intermediate values of the function, and that the output should also be
-  // an intermediate value, to be further aggregated later using
-  // INTERMEDIATE_TO_INTERMEDIATE or INTERMEDIATE_TO_RESULT.
-  AGGREGATION_PHASE_INTERMEDIATE_TO_INTERMEDIATE = 2;
-
-  // A complete invocation: the function should aggregate the given set of
-  // inputs to yield a single return value. This style must be used for
-  // aggregate or window functions that are not decomposable.
-  AGGREGATION_PHASE_INITIAL_TO_RESULT = 3;
-
-  // Specifies that the inputs of the aggregate or window function are the
-  // intermediate values of the function, generated previously using
-  // INITIAL_TO_INTERMEDIATE and possibly INTERMEDIATE_TO_INTERMEDIATE calls.
-  // This call should combine the intermediate values to yield the final
-  // return value.
-  AGGREGATION_PHASE_INTERMEDIATE_TO_RESULT = 4;
-}
-
-// An aggregate function.
-message AggregateFunction {
-  // Points to a function_anchor defined in this plan, which must refer
-  // to an aggregate function in the associated YAML file. Required; 0 is
-  // considered to be a valid anchor/reference.
-  uint32 function_reference = 1;
-
-  // The arguments to be bound to the function. This must have exactly the
-  // number of arguments specified in the function definition, and the
-  // argument types must also match exactly:
-  //
-  //  - Value arguments must be bound using FunctionArgument.value, and
-  //    the expression in that must yield a value of a type that a function
-  //    overload is defined for.
-  //  - Type arguments must be bound using FunctionArgument.type, and a
-  //    function overload must be defined for that type.
-  //  - Enum arguments must be bound using FunctionArgument.enum
-  //    followed by Enum.specified, with a string that case-insensitively
-  //    matches one of the allowed options.
-  //  - Optional enum arguments must be bound using FunctionArgument.enum
-  //    followed by either Enum.specified or Enum.unspecified. If specified,
-  //    the string must case-insensitively match one of the allowed options.
-  repeated FunctionArgument arguments = 7;
-
-  // Options to specify behavior for corner cases, or leave behavior
-  // unspecified if the consumer does not need specific behavior in these
-  // cases.
-  repeated FunctionOption options = 8;
-
-  // Must be set to the return type of the function, exactly as derived
-  // using the declaration in the extension.
-  Type output_type = 5;
-
-  // Describes which part of the aggregation to perform within the context of
-  // distributed algorithms. Required. Must be set to INITIAL_TO_RESULT for
-  // aggregate functions that are not decomposable.
-  AggregationPhase phase = 4;
-
-  // If specified, the aggregated records are ordered according to this list
-  // before they are aggregated. The first sort field has the highest
-  // priority; only if a sort field determines two records to be equivalent is
-  // the next field queried. This field is optional.
-  repeated SortField sorts = 3;
-
-  // Specifies whether equivalent records are merged before being aggregated.
-  // Optional, defaults to AGGREGATION_INVOCATION_ALL.
-  AggregationInvocation invocation = 6;
-
-  // deprecated; use arguments instead
-  repeated Expression args = 2 [deprecated = true];
-
-  // Method in which equivalent records are merged before being aggregated.
-  enum AggregationInvocation {
-    // This default value implies AGGREGATION_INVOCATION_ALL.
-    AGGREGATION_INVOCATION_UNSPECIFIED = 0;
-
-    // Use all values in the aggregation calculation.
-    AGGREGATION_INVOCATION_ALL = 1;
-
-    // Use only distinct values in the aggregation calculation.
-    AGGREGATION_INVOCATION_DISTINCT = 2;
-  }
-
-  // This rel is used  to create references,
-  // in case we refer to a RelRoot field names will be ignored
-  message ReferenceRel {
-    int32 subtree_ordinal = 1;
-  }
-}
diff --git a/proto/substrait/capabilities.proto b/proto/substrait/capabilities.proto
deleted file mode 100644
index 35142718..00000000
--- a/proto/substrait/capabilities.proto
+++ /dev/null
@@ -1,29 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-syntax = "proto3";
-
-package substrait;
-
-option csharp_namespace = "Substrait.Protobuf";
-option go_package = "github.com/substrait-io/substrait-go/proto";
-option java_multiple_files = true;
-option java_package = "io.substrait.proto";
-
-// Defines a set of Capabilities that a system (producer or consumer) supports.
-message Capabilities {
-  // List of Substrait versions this system supports
-  repeated string substrait_versions = 1;
-
-  // list of com.google.Any message types this system supports for advanced
-  // extensions.
-  repeated string advanced_extension_type_urls = 2;
-
-  // list of simple extensions this system supports.
-  repeated SimpleExtension simple_extensions = 3;
-
-  message SimpleExtension {
-    string uri = 1;
-    repeated string function_keys = 2;
-    repeated string type_keys = 3;
-    repeated string type_variation_keys = 4;
-  }
-}
diff --git a/proto/substrait/extended_expression.proto b/proto/substrait/extended_expression.proto
deleted file mode 100644
index 5d115205..00000000
--- a/proto/substrait/extended_expression.proto
+++ /dev/null
@@ -1,51 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-syntax = "proto3";
-
-package substrait;
-
-import "substrait/algebra.proto";
-import "substrait/extensions/extensions.proto";
-import "substrait/plan.proto";
-import "substrait/type.proto";
-
-option csharp_namespace = "Substrait.Protobuf";
-option go_package = "github.com/substrait-io/substrait-go/proto";
-option java_multiple_files = true;
-option java_package = "io.substrait.proto";
-
-message ExpressionReference {
-  oneof expr_type {
-    Expression expression = 1;
-    AggregateFunction measure = 2;
-  }
-  // Field names in depth-first order
-  repeated string output_names = 3;
-}
-
-// Describe a set of operations to complete.
-// For compactness sake, identifiers are normalized at the plan level.
-message ExtendedExpression {
-  // Substrait version of the expression. Optional up to 0.17.0, required for later
-  // versions.
-  Version version = 7;
-
-  // a list of yaml specifications this expression may depend on
-  repeated substrait.extensions.SimpleExtensionURI extension_uris = 1;
-
-  // a list of extensions this expression may depend on
-  repeated substrait.extensions.SimpleExtensionDeclaration extensions = 2;
-
-  // one or more expression trees with same order in plan rel
-  repeated ExpressionReference referred_expr = 3;
-
-  NamedStruct base_schema = 4;
-  // additional extensions associated with this expression.
-  substrait.extensions.AdvancedExtension advanced_extensions = 5;
-
-  // A list of com.google.Any entities that this plan may use. Can be used to
-  // warn if some embedded message types are unknown. Note that this list may
-  // include message types that are ignorable (optimizations) or that are
-  // unused. In many cases, a consumer may be able to work with a plan even if
-  // one or more message types defined here are unknown.
-  repeated string expected_type_urls = 6;
-}
diff --git a/proto/substrait/extensions/extensions.proto b/proto/substrait/extensions/extensions.proto
deleted file mode 100644
index d3af5f3d..00000000
--- a/proto/substrait/extensions/extensions.proto
+++ /dev/null
@@ -1,81 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-syntax = "proto3";
-
-package substrait.extensions;
-
-import "google/protobuf/any.proto";
-
-option csharp_namespace = "Substrait.Protobuf";
-option go_package = "github.com/substrait-io/substrait-go/proto/extensions";
-option java_multiple_files = true;
-option java_package = "io.substrait.proto";
-
-message SimpleExtensionURI {
-  // A surrogate key used in the context of a single plan used to reference the
-  // URI associated with an extension.
-  uint32 extension_uri_anchor = 1;
-
-  // The URI where this extension YAML can be retrieved. This is the "namespace"
-  // of this extension.
-  string uri = 2;
-}
-
-// Describes a mapping between a specific extension entity and the uri where
-// that extension can be found.
-message SimpleExtensionDeclaration {
-  oneof mapping_type {
-    ExtensionType extension_type = 1;
-    ExtensionTypeVariation extension_type_variation = 2;
-    ExtensionFunction extension_function = 3;
-  }
-
-  // Describes a Type
-  message ExtensionType {
-    // references the extension_uri_anchor defined for a specific extension URI.
-    uint32 extension_uri_reference = 1;
-
-    // A surrogate key used in the context of a single plan to reference a
-    // specific extension type
-    uint32 type_anchor = 2;
-
-    // the name of the type in the defined extension YAML.
-    string name = 3;
-  }
-
-  message ExtensionTypeVariation {
-    // references the extension_uri_anchor defined for a specific extension URI.
-    uint32 extension_uri_reference = 1;
-
-    // A surrogate key used in the context of a single plan to reference a
-    // specific type variation
-    uint32 type_variation_anchor = 2;
-
-    // the name of the type in the defined extension YAML.
-    string name = 3;
-  }
-
-  message ExtensionFunction {
-    // references the extension_uri_anchor defined for a specific extension URI.
-    uint32 extension_uri_reference = 1;
-
-    // A surrogate key used in the context of a single plan to reference a
-    // specific function
-    uint32 function_anchor = 2;
-
-    // A simple name if there is only one impl for the function within the YAML.
-    // A compound name, referencing that includes type short names if there is
-    // more than one impl per name in the YAML.
-    string name = 3;
-  }
-}
-
-// A generic object that can be used to embed additional extension information
-// into the serialized substrait plan.
-message AdvancedExtension {
-  // An optimization is helpful information that don't influence semantics. May
-  // be ignored by a consumer.
-  google.protobuf.Any optimization = 1;
-
-  // An enhancement alter semantics. Cannot be ignored by a consumer.
-  google.protobuf.Any enhancement = 2;
-}
diff --git a/proto/substrait/function.proto b/proto/substrait/function.proto
deleted file mode 100644
index 123f4a1b..00000000
--- a/proto/substrait/function.proto
+++ /dev/null
@@ -1,148 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-syntax = "proto3";
-
-package substrait;
-
-import "substrait/parameterized_types.proto";
-import "substrait/type.proto";
-import "substrait/type_expressions.proto";
-
-option csharp_namespace = "Substrait.Protobuf";
-option go_package = "github.com/substrait-io/substrait-go/proto";
-option java_multiple_files = true;
-option java_package = "io.substrait.proto";
-
-// List of function signatures available.
-message FunctionSignature {
-  message FinalArgVariadic {
-    // the minimum number of arguments allowed for the list of final arguments
-    // (inclusive).
-    int64 min_args = 1;
-
-    // the maximum number of arguments allowed for the list of final arguments
-    // (exclusive)
-    int64 max_args = 2;
-
-    // the type of parameterized type consistency
-    ParameterConsistency consistency = 3;
-
-    enum ParameterConsistency {
-      PARAMETER_CONSISTENCY_UNSPECIFIED = 0;
-
-      // All argument must be the same concrete type.
-      PARAMETER_CONSISTENCY_CONSISTENT = 1;
-
-      // Each argument can be any possible concrete type afforded by the bounds
-      // of any parameter defined in the arguments specification.
-      PARAMETER_CONSISTENCY_INCONSISTENT = 2;
-    }
-  }
-
-  message FinalArgNormal {}
-
-  message Scalar {
-    repeated Argument arguments = 2;
-    repeated string name = 3;
-    Description description = 4;
-
-    bool deterministic = 7;
-    bool session_dependent = 8;
-
-    DerivationExpression output_type = 9;
-
-    oneof final_variable_behavior {
-      FinalArgVariadic variadic = 10;
-      FinalArgNormal normal = 11;
-    }
-
-    repeated Implementation implementations = 12;
-  }
-
-  message Aggregate {
-    repeated Argument arguments = 2;
-    string name = 3;
-    Description description = 4;
-
-    bool deterministic = 7;
-    bool session_dependent = 8;
-
-    DerivationExpression output_type = 9;
-
-    oneof final_variable_behavior {
-      FinalArgVariadic variadic = 10;
-      FinalArgNormal normal = 11;
-    }
-
-    bool ordered = 14;
-    uint64 max_set = 12;
-    Type intermediate_type = 13;
-
-    repeated Implementation implementations = 15;
-  }
-
-  message Window {
-    repeated Argument arguments = 2;
-    repeated string name = 3;
-    Description description = 4;
-
-    bool deterministic = 7;
-    bool session_dependent = 8;
-
-    DerivationExpression intermediate_type = 9;
-    DerivationExpression output_type = 10;
-    oneof final_variable_behavior {
-      FinalArgVariadic variadic = 16;
-      FinalArgNormal normal = 17;
-    }
-    bool ordered = 11;
-    uint64 max_set = 12;
-    WindowType window_type = 14;
-    repeated Implementation implementations = 15;
-
-    enum WindowType {
-      WINDOW_TYPE_UNSPECIFIED = 0;
-      WINDOW_TYPE_STREAMING = 1;
-      WINDOW_TYPE_PARTITION = 2;
-    }
-  }
-
-  message Description {
-    string language = 1;
-    string body = 2;
-  }
-
-  message Implementation {
-    Type type = 1;
-    string uri = 2;
-
-    enum Type {
-      TYPE_UNSPECIFIED = 0;
-      TYPE_WEB_ASSEMBLY = 1;
-      TYPE_TRINO_JAR = 2;
-    }
-  }
-
-  message Argument {
-    string name = 1;
-
-    oneof argument_kind {
-      ValueArgument value = 2;
-      TypeArgument type = 3;
-      EnumArgument enum = 4;
-    }
-
-    message ValueArgument {
-      ParameterizedType type = 1;
-      bool constant = 2;
-    }
-
-    message TypeArgument {
-      ParameterizedType type = 1;
-    }
-
-    message EnumArgument {
-      repeated string options = 1;
-      bool optional = 2;
-    }
-  }
-}
diff --git a/proto/substrait/parameterized_types.proto b/proto/substrait/parameterized_types.proto
deleted file mode 100644
index db066935..00000000
--- a/proto/substrait/parameterized_types.proto
+++ /dev/null
@@ -1,128 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-syntax = "proto3";
-
-package substrait;
-
-import "substrait/type.proto";
-
-option csharp_namespace = "Substrait.Protobuf";
-option go_package = "github.com/substrait-io/substrait-go/proto";
-option java_multiple_files = true;
-option java_package = "io.substrait.proto";
-
-message ParameterizedType {
-  oneof kind {
-    Type.Boolean bool = 1;
-    Type.I8 i8 = 2;
-    Type.I16 i16 = 3;
-    Type.I32 i32 = 5;
-    Type.I64 i64 = 7;
-    Type.FP32 fp32 = 10;
-    Type.FP64 fp64 = 11;
-    Type.String string = 12;
-    Type.Binary binary = 13;
-    Type.Timestamp timestamp = 14;
-    Type.Date date = 16;
-    Type.Time time = 17;
-    Type.IntervalYear interval_year = 19;
-    Type.IntervalDay interval_day = 20;
-    Type.TimestampTZ timestamp_tz = 29;
-    Type.UUID uuid = 32;
-
-    ParameterizedFixedChar fixed_char = 21;
-    ParameterizedVarChar varchar = 22;
-    ParameterizedFixedBinary fixed_binary = 23;
-    ParameterizedDecimal decimal = 24;
-
-    ParameterizedStruct struct = 25;
-    ParameterizedList list = 27;
-    ParameterizedMap map = 28;
-
-    ParameterizedUserDefined user_defined = 30;
-
-    // Deprecated in favor of user_defined, which allows nullability and
-    // variations to be specified. If user_defined_pointer is encountered,
-    // treat it as being non-nullable and having the default variation.
-    uint32 user_defined_pointer = 31 [deprecated = true];
-
-    TypeParameter type_parameter = 33;
-  }
-
-  message TypeParameter {
-    string name = 1;
-    repeated ParameterizedType bounds = 2;
-  }
-
-  message IntegerParameter {
-    string name = 1;
-    NullableInteger range_start_inclusive = 2;
-    NullableInteger range_end_exclusive = 3;
-  }
-
-  message NullableInteger {
-    int64 value = 1;
-  }
-
-  message ParameterizedFixedChar {
-    IntegerOption length = 1;
-    uint32 variation_pointer = 2;
-    Type.Nullability nullability = 3;
-  }
-
-  message ParameterizedVarChar {
-    IntegerOption length = 1;
-    uint32 variation_pointer = 2;
-    Type.Nullability nullability = 3;
-  }
-
-  message ParameterizedFixedBinary {
-    IntegerOption length = 1;
-    uint32 variation_pointer = 2;
-    Type.Nullability nullability = 3;
-  }
-
-  message ParameterizedDecimal {
-    IntegerOption scale = 1;
-    IntegerOption precision = 2;
-    uint32 variation_pointer = 3;
-    Type.Nullability nullability = 4;
-  }
-
-  message ParameterizedStruct {
-    repeated ParameterizedType types = 1;
-    uint32 variation_pointer = 2;
-    Type.Nullability nullability = 3;
-  }
-
-  message ParameterizedNamedStruct {
-    // list of names in dfs order
-    repeated string names = 1;
-    ParameterizedStruct struct = 2;
-  }
-
-  message ParameterizedList {
-    ParameterizedType type = 1;
-    uint32 variation_pointer = 2;
-    Type.Nullability nullability = 3;
-  }
-
-  message ParameterizedMap {
-    ParameterizedType key = 1;
-    ParameterizedType value = 2;
-    uint32 variation_pointer = 3;
-    Type.Nullability nullability = 4;
-  }
-
-  message ParameterizedUserDefined {
-    uint32 type_pointer = 1;
-    uint32 variation_pointer = 2;
-    Type.Nullability nullability = 3;
-  }
-
-  message IntegerOption {
-    oneof integer_type {
-      int32 literal = 1;
-      IntegerParameter parameter = 2;
-    }
-  }
-}
diff --git a/proto/substrait/plan.proto b/proto/substrait/plan.proto
deleted file mode 100644
index e5657fb8..00000000
--- a/proto/substrait/plan.proto
+++ /dev/null
@@ -1,82 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-syntax = "proto3";
-
-package substrait;
-
-import "substrait/algebra.proto";
-import "substrait/extensions/extensions.proto";
-
-option csharp_namespace = "Substrait.Protobuf";
-option go_package = "github.com/substrait-io/substrait-go/proto";
-option java_multiple_files = true;
-option java_package = "io.substrait.proto";
-
-// Either a relation or root relation
-message PlanRel {
-  oneof rel_type {
-    // Any relation (used for references and CTEs)
-    Rel rel = 1;
-    // The root of a relation tree
-    RelRoot root = 2;
-  }
-}
-
-// Describe a set of operations to complete.
-// For compactness sake, identifiers are normalized at the plan level.
-message Plan {
-  // Substrait version of the plan. Optional up to 0.17.0, required for later
-  // versions.
-  Version version = 6;
-
-  // a list of yaml specifications this plan may depend on
-  repeated substrait.extensions.SimpleExtensionURI extension_uris = 1;
-
-  // a list of extensions this plan may depend on
-  repeated substrait.extensions.SimpleExtensionDeclaration extensions = 2;
-
-  // one or more relation trees that are associated with this plan.
-  repeated PlanRel relations = 3;
-
-  // additional extensions associated with this plan.
-  substrait.extensions.AdvancedExtension advanced_extensions = 4;
-
-  // A list of com.google.Any entities that this plan may use. Can be used to
-  // warn if some embedded message types are unknown. Note that this list may
-  // include message types that are ignorable (optimizations) or that are
-  // unused. In many cases, a consumer may be able to work with a plan even if
-  // one or more message types defined here are unknown.
-  repeated string expected_type_urls = 5;
-}
-
-// This message type can be used to deserialize only the version of a Substrait
-// Plan message. This prevents deserialization errors when there were breaking
-// changes between the Substrait version of the tool that produced the plan and
-// the Substrait version used to deserialize it, such that a consumer can emit
-// a more helpful error message in this case.
-message PlanVersion {
-  Version version = 6;
-}
-
-message Version {
-  // Substrait version number.
-  uint32 major_number = 1;
-  uint32 minor_number = 2;
-  uint32 patch_number = 3;
-
-  // If a particular version of Substrait is used that does not correspond to
-  // a version number exactly (for example when using an unofficial fork or
-  // using a version that is not yet released or is between versions), set this
-  // to the full git hash of the utilized commit of
-  // https://github.com/substrait-io/substrait (or fork thereof), represented
-  // using a lowercase hex ASCII string 40 characters in length. The version
-  // number above should be set to the most recent version tag in the history
-  // of that commit.
-  string git_hash = 4;
-
-  // Identifying information for the producer that created this plan. Under
-  // ideal circumstances, consumers should not need this information. However,
-  // it is foreseen that consumers may need to work around bugs in particular
-  // producers in practice, and therefore may need to know which producer
-  // created the plan.
-  string producer = 5;
-}
diff --git a/proto/substrait/type.proto b/proto/substrait/type.proto
deleted file mode 100644
index a7f1c665..00000000
--- a/proto/substrait/type.proto
+++ /dev/null
@@ -1,229 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-syntax = "proto3";
-
-package substrait;
-
-import "google/protobuf/empty.proto";
-
-option csharp_namespace = "Substrait.Protobuf";
-option go_package = "github.com/substrait-io/substrait-go/proto";
-option java_multiple_files = true;
-option java_package = "io.substrait.proto";
-
-message Type {
-  oneof kind {
-    Boolean bool = 1;
-    I8 i8 = 2;
-    I16 i16 = 3;
-    I32 i32 = 5;
-    I64 i64 = 7;
-    FP32 fp32 = 10;
-    FP64 fp64 = 11;
-    String string = 12;
-    Binary binary = 13;
-    Timestamp timestamp = 14;
-    Date date = 16;
-    Time time = 17;
-    IntervalYear interval_year = 19;
-    IntervalDay interval_day = 20;
-    TimestampTZ timestamp_tz = 29;
-    UUID uuid = 32;
-
-    FixedChar fixed_char = 21;
-    VarChar varchar = 22;
-    FixedBinary fixed_binary = 23;
-    Decimal decimal = 24;
-
-    Struct struct = 25;
-    List list = 27;
-    Map map = 28;
-
-    UserDefined user_defined = 30;
-
-    // Deprecated in favor of user_defined, which allows nullability and
-    // variations to be specified. If user_defined_type_reference is
-    // encountered, treat it as being non-nullable and having the default
-    // variation.
-    uint32 user_defined_type_reference = 31 [deprecated = true];
-  }
-
-  enum Nullability {
-    NULLABILITY_UNSPECIFIED = 0;
-    NULLABILITY_NULLABLE = 1;
-    NULLABILITY_REQUIRED = 2;
-  }
-
-  message Boolean {
-    uint32 type_variation_reference = 1;
-    Nullability nullability = 2;
-  }
-
-  message I8 {
-    uint32 type_variation_reference = 1;
-    Nullability nullability = 2;
-  }
-
-  message I16 {
-    uint32 type_variation_reference = 1;
-    Nullability nullability = 2;
-  }
-
-  message I32 {
-    uint32 type_variation_reference = 1;
-    Nullability nullability = 2;
-  }
-
-  message I64 {
-    uint32 type_variation_reference = 1;
-    Nullability nullability = 2;
-  }
-
-  message FP32 {
-    uint32 type_variation_reference = 1;
-    Nullability nullability = 2;
-  }
-
-  message FP64 {
-    uint32 type_variation_reference = 1;
-    Nullability nullability = 2;
-  }
-
-  message String {
-    uint32 type_variation_reference = 1;
-    Nullability nullability = 2;
-  }
-
-  message Binary {
-    uint32 type_variation_reference = 1;
-    Nullability nullability = 2;
-  }
-
-  message Timestamp {
-    uint32 type_variation_reference = 1;
-    Nullability nullability = 2;
-  }
-
-  message Date {
-    uint32 type_variation_reference = 1;
-    Nullability nullability = 2;
-  }
-
-  message Time {
-    uint32 type_variation_reference = 1;
-    Nullability nullability = 2;
-  }
-
-  message TimestampTZ {
-    uint32 type_variation_reference = 1;
-    Nullability nullability = 2;
-  }
-
-  message IntervalYear {
-    uint32 type_variation_reference = 1;
-    Nullability nullability = 2;
-  }
-
-  message IntervalDay {
-    uint32 type_variation_reference = 1;
-    Nullability nullability = 2;
-  }
-
-  message UUID {
-    uint32 type_variation_reference = 1;
-    Nullability nullability = 2;
-  }
-
-  // Start compound types.
-  message FixedChar {
-    int32 length = 1;
-    uint32 type_variation_reference = 2;
-    Nullability nullability = 3;
-  }
-
-  message VarChar {
-    int32 length = 1;
-    uint32 type_variation_reference = 2;
-    Nullability nullability = 3;
-  }
-
-  message FixedBinary {
-    int32 length = 1;
-    uint32 type_variation_reference = 2;
-    Nullability nullability = 3;
-  }
-
-  message Decimal {
-    int32 scale = 1;
-    int32 precision = 2;
-    uint32 type_variation_reference = 3;
-    Nullability nullability = 4;
-  }
-
-  message Struct {
-    repeated Type types = 1;
-    uint32 type_variation_reference = 2;
-    Nullability nullability = 3;
-  }
-
-  message List {
-    Type type = 1;
-    uint32 type_variation_reference = 2;
-    Nullability nullability = 3;
-  }
-
-  message Map {
-    Type key = 1;
-    Type value = 2;
-    uint32 type_variation_reference = 3;
-    Nullability nullability = 4;
-  }
-
-  message UserDefined {
-    uint32 type_reference = 1;
-    uint32 type_variation_reference = 2;
-    Nullability nullability = 3;
-    repeated Parameter type_parameters = 4;
-  }
-
-  message Parameter {
-    oneof parameter {
-      // Explicitly null/unspecified parameter, to select the default value (if
-      // any).
-      google.protobuf.Empty null = 1;
-
-      // Data type parameters, like the i32 in LIST<i32>.
-      Type data_type = 2;
-
-      // Value parameters, like the 10 in VARCHAR<10>.
-      bool boolean = 3;
-      int64 integer = 4;
-      string enum = 5;
-      string string = 6;
-    }
-  }
-}
-
-// A message for modeling name/type pairs.
-//
-// Useful for representing relation schemas.
-//
-// Notes:
-//
-// * The names field is in depth-first order.
-//
-// For example a schema such as:
-//
-// a: int64
-// b: struct<c: float32, d: string>
-//
-// would have a `names` field that looks like:
-//
-// ["a", "b", "c", "d"]
-//
-// * Only struct fields are contained in this field's elements,
-// * Map keys should be traversed first, then values when producing/consuming
-message NamedStruct {
-  // list of names in dfs order
-  repeated string names = 1;
-  Type.Struct struct = 2;
-}
diff --git a/proto/substrait/type_expressions.proto b/proto/substrait/type_expressions.proto
deleted file mode 100644
index 4be4aab4..00000000
--- a/proto/substrait/type_expressions.proto
+++ /dev/null
@@ -1,160 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-syntax = "proto3";
-
-package substrait;
-
-import "substrait/type.proto";
-
-option csharp_namespace = "Substrait.Protobuf";
-option go_package = "github.com/substrait-io/substrait-go/proto";
-option java_multiple_files = true;
-option java_package = "io.substrait.proto";
-
-message DerivationExpression {
-  oneof kind {
-    Type.Boolean bool = 1;
-    Type.I8 i8 = 2;
-    Type.I16 i16 = 3;
-    Type.I32 i32 = 5;
-    Type.I64 i64 = 7;
-    Type.FP32 fp32 = 10;
-    Type.FP64 fp64 = 11;
-    Type.String string = 12;
-    Type.Binary binary = 13;
-    Type.Timestamp timestamp = 14;
-    Type.Date date = 16;
-    Type.Time time = 17;
-    Type.IntervalYear interval_year = 19;
-    Type.IntervalDay interval_day = 20;
-    Type.TimestampTZ timestamp_tz = 29;
-    Type.UUID uuid = 32;
-
-    ExpressionFixedChar fixed_char = 21;
-    ExpressionVarChar varchar = 22;
-    ExpressionFixedBinary fixed_binary = 23;
-    ExpressionDecimal decimal = 24;
-
-    ExpressionStruct struct = 25;
-    ExpressionList list = 27;
-    ExpressionMap map = 28;
-
-    ExpressionUserDefined user_defined = 30;
-
-    // Deprecated in favor of user_defined, which allows nullability and
-    // variations to be specified. If user_defined_pointer is encountered,
-    // treat it as being non-nullable and having the default variation.
-    uint32 user_defined_pointer = 31 [deprecated = true];
-
-    string type_parameter_name = 33;
-    string integer_parameter_name = 34;
-
-    int32 integer_literal = 35;
-    UnaryOp unary_op = 36;
-    BinaryOp binary_op = 37;
-    IfElse if_else = 38;
-    ReturnProgram return_program = 39;
-  }
-
-  message ExpressionFixedChar {
-    DerivationExpression length = 1;
-    uint32 variation_pointer = 2;
-    Type.Nullability nullability = 3;
-  }
-
-  message ExpressionVarChar {
-    DerivationExpression length = 1;
-    uint32 variation_pointer = 2;
-    Type.Nullability nullability = 3;
-  }
-
-  message ExpressionFixedBinary {
-    DerivationExpression length = 1;
-    uint32 variation_pointer = 2;
-    Type.Nullability nullability = 3;
-  }
-
-  message ExpressionDecimal {
-    DerivationExpression scale = 1;
-    DerivationExpression precision = 2;
-    uint32 variation_pointer = 3;
-    Type.Nullability nullability = 4;
-  }
-
-  message ExpressionStruct {
-    repeated DerivationExpression types = 1;
-    uint32 variation_pointer = 2;
-    Type.Nullability nullability = 3;
-  }
-
-  message ExpressionNamedStruct {
-    repeated string names = 1;
-    ExpressionStruct struct = 2;
-  }
-
-  message ExpressionList {
-    DerivationExpression type = 1;
-    uint32 variation_pointer = 2;
-    Type.Nullability nullability = 3;
-  }
-
-  message ExpressionMap {
-    DerivationExpression key = 1;
-    DerivationExpression value = 2;
-    uint32 variation_pointer = 3;
-    Type.Nullability nullability = 4;
-  }
-
-  message ExpressionUserDefined {
-    uint32 type_pointer = 1;
-    uint32 variation_pointer = 2;
-    Type.Nullability nullability = 3;
-  }
-
-  message IfElse {
-    DerivationExpression if_condition = 1;
-    DerivationExpression if_return = 2;
-    DerivationExpression else_return = 3;
-  }
-
-  message UnaryOp {
-    UnaryOpType op_type = 1;
-    DerivationExpression arg = 2;
-
-    enum UnaryOpType {
-      UNARY_OP_TYPE_UNSPECIFIED = 0;
-      UNARY_OP_TYPE_BOOLEAN_NOT = 1;
-    }
-  }
-
-  message BinaryOp {
-    BinaryOpType op_type = 1;
-    DerivationExpression arg1 = 2;
-    DerivationExpression arg2 = 3;
-
-    enum BinaryOpType {
-      BINARY_OP_TYPE_UNSPECIFIED = 0;
-      BINARY_OP_TYPE_PLUS = 1;
-      BINARY_OP_TYPE_MINUS = 2;
-      BINARY_OP_TYPE_MULTIPLY = 3;
-      BINARY_OP_TYPE_DIVIDE = 4;
-      BINARY_OP_TYPE_MIN = 5;
-      BINARY_OP_TYPE_MAX = 6;
-      BINARY_OP_TYPE_GREATER_THAN = 7;
-      BINARY_OP_TYPE_LESS_THAN = 8;
-      BINARY_OP_TYPE_AND = 9;
-      BINARY_OP_TYPE_OR = 10;
-      BINARY_OP_TYPE_EQUALS = 11;
-      BINARY_OP_TYPE_COVERS = 12;
-    }
-  }
-
-  message ReturnProgram {
-    message Assignment {
-      string name = 1;
-      DerivationExpression expression = 2;
-    }
-
-    repeated Assignment assignments = 1;
-    DerivationExpression final_expression = 2;
-  }
-}
diff --git a/proto_prefix.py b/proto_prefix.py
deleted file mode 100644
index 6c4b57ab..00000000
--- a/proto_prefix.py
+++ /dev/null
@@ -1,395 +0,0 @@
-#!/usr/bin/python3
-# SPDX-License-Identifier: Apache-2.0
-# type: ignore
-
-"""
-Copies the .proto files to a new directory while changing their package prefix
-and rewriting their option statements.
-
-This allows a single executable to use different versions of a protobuf package
-simultaneously. Any attempt to load different versions in the same protobuf
-namespace within a single executable, even if this is done by entirely
-unrelated transitively-linked libraries outside of your control, will silently
-break the official protobuf library implementation. This is due to a shared
-global variable that it uses to map message types to their implementation.
-
-If you use a protobuf package within a public library, it is therefore strongly
-recommended to namespace said package to your library with a sufficiently unique
-path (usually, the name of your library is fine).
-
-Note that the only things Substrait-specific to this script are some default
-values for optional arguments.
-"""
-
-import pathlib
-import re
-import sys
-
-
-def tokenize(data):
-    """Tokenizes a string into (cls, match) tuples, where cls is one of
-    'ident', 'string', 'number', 'symbol', 'comment', or 'space', and match is
-    the matched string. All characters will be made part of a token, so joining
-    all matches yields exactly the original string."""
-    tokens = dict(
-        ident=re.compile(r"[a-zA-Z_][a-zA-Z_0-9.]*"),
-        string=re.compile(r'"(?:[^"\\]|\\.)*"'),
-        number=re.compile(r"[0-9]+"),
-        symbol=re.compile(r"[=;{}\[\]]"),
-        comment=re.compile(r"//[^\n]*\n|/\*(?:(?!\*/).)*\*/"),
-        space=re.compile(r"\s+"),
-    )
-
-    while data:
-        longest_match = ""
-        longest_cls = ""
-        for cls, regex in tokens.items():
-            match = regex.match(data)
-            if match:
-                match = match.group(0)
-            else:
-                match = ""
-            if len(match) > len(longest_match):
-                longest_match = match
-                longest_cls = cls
-        if not longest_match:
-            raise ValueError(f'Failed to tokenize near "{data[:30]}"')
-        data = data[len(longest_match) :]
-        yield longest_cls, longest_match
-
-
-class Group:
-    """A group of tokens, indexed as if semantically-irrelevant tokens
-    (whitespace, comments, etc) don't exist."""
-
-    def __init__(self):
-        super().__init__()
-        self.tokens = []
-        self.indices = []
-
-    def append(self, cls, match, significant=None):
-        if significant is None:
-            significant = cls not in ["comment", "space"]
-        if significant:
-            self.indices.append(len(self.tokens))
-        self.tokens.append([cls, match])
-
-    def __getitem__(self, idx):
-        if idx >= len(self.indices):
-            return ""
-        return self.tokens[self.indices[idx]][1]
-
-    def __setitem__(self, idx, value):
-        self.tokens[self.indices[idx]][1] = value
-
-    def __iter__(self):
-        for idx in self.indices:
-            yield self.tokens[idx][1]
-
-    def __len__(self):
-        return len(self.indices)
-
-    def cls(self, idx):
-        return self.tokens[self.indices[idx]][0]
-
-    def __str__(self):
-        return "".join(map(lambda x: x[1], self.tokens))
-
-
-def group_tokens(tokens):
-    """Groups tokens into "statements," where a statement is defined as
-    something starting with an identifier and ending with either a
-    semicolon or a {} block. That's probably not accurate for the whole
-    protobuf syntax, but good enough to reliably capture package, import, and
-    option statements without breaking anything else."""
-    token_it = iter(tokens)
-    group = Group()
-    for cls, match in token_it:
-        # Look for the first identifier.
-        if cls != "ident":
-            group.append(cls, match, False)
-            continue
-
-        group.append(cls, match, True)
-
-        # Append tokens to the group until we reach the end of the statement.
-        nesting = 0
-        for cls2, match2 in token_it:
-            group.append(cls2, match2)
-            if match2 == "{":
-                nesting += 1
-            elif match2 == "}":
-                nesting -= 1
-                if nesting == 0:
-                    break
-            elif match2 == ";" and nesting == 0:
-                break
-
-        # Yield the statement group.
-        yield group
-        group = Group()
-
-    # Yield the whitespace at the end of the file.
-    yield group
-
-
-def convert_case(string, case):
-    """Converts from lowercase to uppercase (UPPER), camelcase (camel), or
-    pascalcase (Pascal), or leaves the string as-is (lower)."""
-    assert string == string.lower()
-    if case == "lower":
-        return string
-    if case == "UPPER":
-        return string.upper()
-    if case == "Pascal":
-        return "".join(map(str.title, string.split("_")))
-    if case == "camel":
-        first, *remain = string.split("_")
-        return first + "".join(map(str.title, remain))
-    raise ValueError(f"unknown case convention {case:r}")
-
-
-class IgnoreFile(Exception):
-    """Thrown by a group converter when the package specified in the proto
-    file is not on the source prefix."""
-
-
-def make_group_converter(prefix_from, prefix_to, **options):
-    """Makes a group converter function bound to the given configuration.
-    prefix_from and prefix_to should be either .-separated strings or lists
-    of lowercase protobuf namespaces representing the namespace prefix
-    replacement to be made. Any named arguments are used for generating
-    option statements, where the argument name is the option name, and the
-    value is either a str, int, or bool representing the value. str options
-    may include {<case><sep>} capture groups, where case is either lower,
-    UPPER, Pascal, or camel, and sep is any separator. This expands to
-    ".extensions" (with the appropriate separator in place of . and with
-    extensions written in the appropriate case convention) for
-    substrait.extensions, and to the empty string for substrait."""
-
-    def preprocess_prefix(prefix):
-        if isinstance(prefix, str):
-            prefix = prefix.split(".")
-        else:
-            prefix = list(prefix)
-        if not prefix:
-            raise ValueError("prefix cannot be empty")
-        for element in prefix:
-            if element != element.lower():
-                raise ValueError("prefix must be lowercase")
-        return prefix
-
-    prefix_from = preprocess_prefix(prefix_from)
-    prefix_to = preprocess_prefix(prefix_to)
-
-    def format_inner_namespace(inner_namespace, separator, case):
-        return "".join(
-            map(lambda el: separator + convert_case(el, case), inner_namespace)
-        )
-
-    def generate_options(inner_namespace):
-        first = True
-        for key, value in options.items():
-            group = Group()
-            if first:
-                first = False
-                group.append("space", "\n\n")
-            else:
-                group.append("space", "\n")
-            group.append("ident", "option")
-            group.append("space", " ")
-            group.append("ident", key)
-            group.append("space", " ")
-            group.append("symbol", "=")
-            group.append("space", " ")
-            if isinstance(value, str):
-                value = re.sub(
-                    r"{([^{}a-zA-Z]+)([a-zA-Z]+)}",
-                    lambda x: format_inner_namespace(
-                        inner_namespace, x.group(1), x.group(2)
-                    ),
-                    value,
-                )
-                value = value.replace("{{", "{")
-                value = value.replace("}}", "}")
-                value = value.replace("\\", "\\\\")
-                value = value.replace("\n", "\\n")
-                value = value.replace('"', '\\"')
-                group.append("string", f'"{value}"')
-            elif isinstance(value, bool):
-                if value:
-                    group.append("ident", "true")
-                else:
-                    group.append("ident", "false")
-            elif isinstance(value, int):
-                group.append("number", str(value))
-            else:
-                raise TypeError(type(value))
-            group.append("symbol", ";")
-            yield group
-
-    def convert_groups(groups):
-        inner_namespace = []
-        seen_options = False
-        for group in groups:
-            # Update package statement.
-            if group[0] == "package":
-                assert len(group) == 3
-                assert group.cls(1) == "ident"
-                package = group[1].split(".")
-                if package[: len(prefix_from)] != prefix_from:
-                    raise IgnoreFile()
-                inner_namespace = package[len(prefix_from) :]
-                group[1] = ".".join(prefix_to + inner_namespace)
-                yield group
-
-            # Update import statements.
-            elif group[0] == "import":
-                assert len(group) == 3
-                assert group.cls(1) == "string"
-                components = group[1][1:-1].split("/")
-                assert components
-                if components[: len(prefix_from)] == prefix_from:
-                    components = prefix_to + components[len(prefix_from) :]
-                group[1] = '"' + "/".join(components) + '"'
-                yield group
-
-            # Replace option statements.
-            elif group[0] == "option":
-                if not seen_options:
-                    seen_options = True
-                    yield from generate_options(inner_namespace)
-
-            # For all other groups, modify any identifiers that look like a
-            # fully-qualified type name.
-            else:
-                for idx, token in enumerate(group):
-                    if group.cls(idx) == "ident":
-                        name = token.split(".")
-                        if name[: len(prefix_from)] == prefix_from:
-                            name = prefix_to + name[len(prefix_from) :]
-                            group[idx] = ".".join(name)
-                yield group
-
-    return convert_groups
-
-
-def get_package(groups):
-    """Given a list of groups, find the package statement and return its
-    content. If there is no package statement, return []."""
-    for group in groups:
-        if group[0] == "package":
-            assert len(group) == 3
-            assert group.cls(1) == "ident"
-            return group[1].split(".")
-    return []
-
-
-def convert_files(
-    dest_dir, dest_prefix, src_dir=".", src_prefix="substrait", **options
-):
-    """Converts all proto files found in src_dir (or the current directory if
-    None) to the given destination directory, replacing the given package
-    prefix (by default, substrait becomes dest_prefix and substrait.extensions
-    becomes dest_prefix.extensions) and the given option statements. For the
-    options, the argument name is the option name, and the value is either a
-    str, int, or bool representing the value. str options may include
-    {<case><sep>} capture groups, where case is either lower, UPPER, Pascal, or
-    camel, and sep is any separator. This expands to ".extensions" (with the
-    appropriate separator in place of . and with extensions written in the
-    appropriate case convention) for substrait.extensions, and to the empty
-    string for substrait."""
-
-    group_converter = make_group_converter(src_prefix, dest_prefix, **options)
-
-    n_written = 0
-    n_up_to_date = 0
-    n_not_in_prefix = 0
-
-    for src_path in pathlib.Path(src_dir).rglob("*.proto"):
-        with open(src_path, encoding="utf-8") as fil:
-            data = fil.read()
-        try:
-            groups = list(group_converter(group_tokens(tokenize(data))))
-        except IgnoreFile:
-            n_not_in_prefix += 1
-            continue
-        data = "".join(map(str, groups))
-        dest_path = pathlib.Path(dest_dir, *get_package(groups), src_path.name)
-        if dest_path.exists():
-            with open(dest_path, encoding="utf-8") as fil:
-                if fil.read() == data:
-                    n_up_to_date += 1
-                    continue
-        else:
-            dest_path.parent.mkdir(parents=True, exist_ok=True)
-        with open(dest_path, "w", encoding="utf-8") as fil:
-            fil.write(data)
-        n_written += 1
-
-    return n_written, n_up_to_date, n_not_in_prefix
-
-
-def cmd_line():
-    """Runs the script as if it had been run from the command line."""
-
-    # Unpack command line.
-    positional = []
-    options = {}
-    for arg in sys.argv[1:]:
-        arg = arg.split("=", maxsplit=1)
-        if len(arg) == 2:
-            option, value = arg
-            if not value:
-                value = None
-            elif value == "true":
-                value = True
-            elif value == "false":
-                value = False
-            elif re.fullmatch(r"[0-9]+", value):
-                value = int(value)
-            options[option] = value
-        else:
-            (value,) = arg
-            positional.append(value)
-
-    # Check command line, print help if wrong.
-    script = (sys.argv[:1] + ["proto_prefix.py"])[0]
-    if len(positional) < 2 or len(positional) > 4:
-        print(
-            f"Usage: {script} <dest_dir> <dest_prefix> "
-            "[src_dir] [src_prefix] [key=value...]"
-        )
-        print("Default src_dir = .")
-        print("Default src_prefix = substrait")
-        print(__doc__)
-        sys.exit(2)
-
-    # Load default options, to mimic the options currently in the Substrait
-    # proto files. The go namespace is not included, as it seems to be too
-    # specific to compute from just a prefix.
-    lower_prefix = positional[1]
-    csharp_prefix = ".".join(
-        map(lambda el: convert_case(el, "Pascal"), lower_prefix.split("."))
-    )
-    java_prefix = lower_prefix
-    default_options = dict(
-        csharp_namespace=f"{csharp_prefix}.Protobuf",
-        java_multiple_files=True,
-        java_package=f"io.{java_prefix}.proto",
-    )
-    default_options.update(options)
-    options = dict(filter(lambda x: x[1] is not None, default_options.items()))
-
-    # Perform the conversion.
-    n_written, n_up_to_date, n_not_in_prefix = convert_files(*positional, **options)
-
-    # Print statistics.
-    print(
-        f"{script}: wrote {n_written} file(s), {n_up_to_date} up-to-date, "
-        f"{n_not_in_prefix} not in src prefix"
-    )
-
-
-if __name__ == "__main__":
-    cmd_line()
diff --git a/pyproject.toml b/pyproject.toml
index 29c30996..17ec71ea 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,7 +1,6 @@
 [tool.poetry]
 name = "ibis-substrait"
-version = "2.29.1"
-build = "build.py"
+version = "2.29.0"
 packages = [{ include = "ibis_substrait" }]
 homepage = "https://github.com/ibis-project/ibis-substrait"
 repository = "https://github.com/ibis-project/ibis-substrait"
@@ -20,22 +19,17 @@ classifiers = [
 ]
 
 [tool.poetry.dependencies]
-python = ">=3.8.1,<4"
+python = ">=3.9,<4"
 ibis-framework = ">=3"
 packaging = ">=21.3"
 pyyaml = ">=5"
-# protobuf==3.20 C extensions aren't compatible with 3.19.4
-# protobuf >= 3.20.1 required for using ibis-substrait
-# protobuf == 3.20.1 required for regenerating Python Substrait pb2 files
-protobuf = ">=3.20.1" 
+substrait = ">=0.2.1"
 
 [tool.poetry.group.dev.dependencies]
 black = ">=23.0.0"
 duckdb = ">=0.4.0"
 duckdb-engine = ">=0.5"
 ipython = ">=8.2.0"
-protobuf = "3.20.1" 
-protoletariat = ">=2.0.0"
 ruff = ">=0.0.252"
 setuptools = ">=67.0.0"
 
@@ -115,11 +109,9 @@ ignore = [
   "SIM114", # combine `if` branches
   "SIM117", # nested withs
   "SIM118", # remove .keys() calls from dictionaries
-  # TODO(gil): re-enable after we drop 3.8
   "UP006", # use collections.deque instead of Deque for type annotation
 ]
-exclude = ["ibis_substrait/proto", "proto_prefix.py"]
-target-version = "py38"
+target-version = "py39"
 
 [tool.ruff.per-file-ignores]
 "*test*.py" = ["D"] # ignore all docstring lints in tests
@@ -150,20 +142,15 @@ filterwarnings = [
   "ignore: Deprecated API features detected:sqlalchemy.exc.RemovedIn20Warning",
   # ignore struct pairs deprecation while we still support 3.x
   "ignore: `Struct.pairs` is deprecated:FutureWarning",
-  # ignore importlib.resources.path deprecation while 3.8 is still supported
-  # we'll drop 3.8 before we add support for 3.12, then we can handle this
-  "ignore: path is deprecated:DeprecationWarning"
 ]
 markers = ["no_decompile"]
 norecursedirs = ["site-packages", "dist-packages", ".direnv"]
 
 [tool.black]
 line_length = 88
-exclude = "ibis_substrait/proto"
 
 [tool.isort]
 profile = "black"
-skip_glob = ["ibis_substrait/proto/**/*.py"]
 
 [tool.mypy]
 exclude = '((tests|docs)/.+|build)\.py'


Test patch:
diff --git a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h01/tpc_h01.json b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h01/tpc_h01.json
index adc978df..99317dd3 100644
--- a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h01/tpc_h01.json
+++ b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h01/tpc_h01.json
@@ -710,7 +710,7 @@
     }
   ],
   "version": {
-    "minorNumber": 24,
+    "minorNumber": 30,
     "producer": "ibis-substrait"
   }
 }
\ No newline at end of file
diff --git a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h03/tpc_h03.json b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h03/tpc_h03.json
index a23d74e3..faef2ccf 100644
--- a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h03/tpc_h03.json
+++ b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h03/tpc_h03.json
@@ -736,7 +736,7 @@
     }
   ],
   "version": {
-    "minorNumber": 24,
+    "minorNumber": 30,
     "producer": "ibis-substrait"
   }
 }
\ No newline at end of file
diff --git a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h04/tpc_h04.json b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h04/tpc_h04.json
index fed6033c..deca5db8 100644
--- a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h04/tpc_h04.json
+++ b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h04/tpc_h04.json
@@ -508,7 +508,7 @@
     }
   ],
   "version": {
-    "minorNumber": 24,
+    "minorNumber": 30,
     "producer": "ibis-substrait"
   }
 }
\ No newline at end of file
diff --git a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h05/tpc_h05.json b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h05/tpc_h05.json
index f749bfca..73f401bb 100644
--- a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h05/tpc_h05.json
+++ b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h05/tpc_h05.json
@@ -1012,7 +1012,7 @@
     }
   ],
   "version": {
-    "minorNumber": 24,
+    "minorNumber": 30,
     "producer": "ibis-substrait"
   }
 }
\ No newline at end of file
diff --git a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h06/tpc_h06.json b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h06/tpc_h06.json
index a1b3199b..b54411e8 100644
--- a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h06/tpc_h06.json
+++ b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h06/tpc_h06.json
@@ -436,7 +436,7 @@
     }
   ],
   "version": {
-    "minorNumber": 24,
+    "minorNumber": 30,
     "producer": "ibis-substrait"
   }
 }
\ No newline at end of file
diff --git a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h07/tpc_h07.json b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h07/tpc_h07.json
index 42b57763..5d5b4c22 100644
--- a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h07/tpc_h07.json
+++ b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h07/tpc_h07.json
@@ -1242,7 +1242,7 @@
     }
   ],
   "version": {
-    "minorNumber": 24,
+    "minorNumber": 30,
     "producer": "ibis-substrait"
   }
 }
\ No newline at end of file
diff --git a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h090/tpc_h090.json b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h090/tpc_h090.json
index fa52f996..61e3a675 100644
--- a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h090/tpc_h090.json
+++ b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h090/tpc_h090.json
@@ -1121,7 +1121,7 @@
     }
   ],
   "version": {
-    "minorNumber": 24,
+    "minorNumber": 30,
     "producer": "ibis-substrait"
   }
 }
\ No newline at end of file
diff --git a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h091/tpc_h091.json b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h091/tpc_h091.json
index 9f078e44..72891b0f 100644
--- a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h091/tpc_h091.json
+++ b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h091/tpc_h091.json
@@ -1121,7 +1121,7 @@
     }
   ],
   "version": {
-    "minorNumber": 24,
+    "minorNumber": 30,
     "producer": "ibis-substrait"
   }
 }
\ No newline at end of file
diff --git a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h10/tpc_h10.json b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h10/tpc_h10.json
index 3ab38e43..f1848903 100644
--- a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h10/tpc_h10.json
+++ b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h10/tpc_h10.json
@@ -867,7 +867,7 @@
     }
   ],
   "version": {
-    "minorNumber": 24,
+    "minorNumber": 30,
     "producer": "ibis-substrait"
   }
 }
\ No newline at end of file
diff --git a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h11/tpc_h11.json b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h11/tpc_h11.json
index a6985700..ca2fe2ec 100644
--- a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h11/tpc_h11.json
+++ b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h11/tpc_h11.json
@@ -509,7 +509,7 @@
     }
   ],
   "version": {
-    "minorNumber": 24,
+    "minorNumber": 30,
     "producer": "ibis-substrait"
   }
 }
\ No newline at end of file
diff --git a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h12/tpc_h12.json b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h12/tpc_h12.json
index c6182195..3e76305c 100644
--- a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h12/tpc_h12.json
+++ b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h12/tpc_h12.json
@@ -774,7 +774,7 @@
     }
   ],
   "version": {
-    "minorNumber": 24,
+    "minorNumber": 30,
     "producer": "ibis-substrait"
   }
 }
\ No newline at end of file
diff --git a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h13/tpc_h13.json b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h13/tpc_h13.json
index 5de3e143..4d59d958 100644
--- a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h13/tpc_h13.json
+++ b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h13/tpc_h13.json
@@ -421,7 +421,7 @@
     }
   ],
   "version": {
-    "minorNumber": 24,
+    "minorNumber": 30,
     "producer": "ibis-substrait"
   }
 }
\ No newline at end of file
diff --git a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h18/tpc_h18.json b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h18/tpc_h18.json
index 527010ed..40f99970 100644
--- a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h18/tpc_h18.json
+++ b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h18/tpc_h18.json
@@ -561,7 +561,7 @@
     }
   ],
   "version": {
-    "minorNumber": 24,
+    "minorNumber": 30,
     "producer": "ibis-substrait"
   }
 }
\ No newline at end of file
diff --git a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h19/tpc_h19.json b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h19/tpc_h19.json
index 8279bb4f..0d03c7e4 100644
--- a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h19/tpc_h19.json
+++ b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h19/tpc_h19.json
@@ -1423,7 +1423,7 @@
     }
   ],
   "version": {
-    "minorNumber": 24,
+    "minorNumber": 30,
     "producer": "ibis-substrait"
   }
 }
\ No newline at end of file
diff --git a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h20/tpc_h20.json b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h20/tpc_h20.json
index 0a6f17d8..cafdf20c 100644
--- a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h20/tpc_h20.json
+++ b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h20/tpc_h20.json
@@ -313,7 +313,7 @@
     }
   ],
   "version": {
-    "minorNumber": 24,
+    "minorNumber": 30,
     "producer": "ibis-substrait"
   }
 }
\ No newline at end of file
diff --git a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h21/tpc_h21.json b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h21/tpc_h21.json
index e096a3ca..a0f0f2f7 100644
--- a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h21/tpc_h21.json
+++ b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h21/tpc_h21.json
@@ -1330,7 +1330,7 @@
     }
   ],
   "version": {
-    "minorNumber": 24,
+    "minorNumber": 30,
     "producer": "ibis-substrait"
   }
 }
\ No newline at end of file
diff --git a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h22/tpc_h22.json b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h22/tpc_h22.json
index 6640a53e..8d381b60 100644
--- a/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h22/tpc_h22.json
+++ b/ibis_substrait/tests/compiler/snapshots/test_tpch/test_compile/tpc_h22/tpc_h22.json
@@ -617,7 +617,7 @@
     }
   ],
   "version": {
-    "minorNumber": 24,
+    "minorNumber": 30,
     "producer": "ibis-substrait"
   }
 }
\ No newline at end of file
diff --git a/ibis_substrait/tests/compiler/test_compiler.py b/ibis_substrait/tests/compiler/test_compiler.py
index af544813..288e6837 100644
--- a/ibis_substrait/tests/compiler/test_compiler.py
+++ b/ibis_substrait/tests/compiler/test_compiler.py
@@ -5,10 +5,10 @@
 import pytest
 from google.protobuf import json_format
 from ibis import _
+from substrait.gen.proto import algebra_pb2 as stalg
+from substrait.gen.proto import type_pb2 as stt
 
 from ibis_substrait.compiler.translate import translate
-from ibis_substrait.proto.substrait.ibis import algebra_pb2 as stalg
-from ibis_substrait.proto.substrait.ibis import type_pb2 as stt
 
 NULLABILITY_NULLABLE = stt.Type.Nullability.NULLABILITY_NULLABLE
 NULLABILITY_REQUIRED = stt.Type.Nullability.NULLABILITY_REQUIRED
diff --git a/ibis_substrait/tests/compiler/test_decompiler.py b/ibis_substrait/tests/compiler/test_decompiler.py
index 788e1b7d..65041e1c 100644
--- a/ibis_substrait/tests/compiler/test_decompiler.py
+++ b/ibis_substrait/tests/compiler/test_decompiler.py
@@ -2,9 +2,9 @@
 import ibis.expr.datatypes as dt
 import pytest
 from packaging import version
+from substrait.gen.proto import type_pb2 as stt
 
 from ibis_substrait.compiler.decompile import decompile, decompile_schema
-from ibis_substrait.proto.substrait.ibis import type_pb2 as stt
 
 ibis5 = pytest.mark.skipif(
     version.parse(ibis.__version__) >= version.parse("5.0.0"),
diff --git a/ibis_substrait/tests/compiler/test_literal.py b/ibis_substrait/tests/compiler/test_literal.py
index 30db0e07..0df27b4b 100644
--- a/ibis_substrait/tests/compiler/test_literal.py
+++ b/ibis_substrait/tests/compiler/test_literal.py
@@ -7,11 +7,11 @@
 import ibis.expr.datatypes as dt
 import pytest
 import pytz
+from substrait.gen.proto import algebra_pb2 as stalg
+from substrait.gen.proto import type_pb2 as stt
 
 from ibis_substrait.compiler.decompile import decompile
 from ibis_substrait.compiler.translate import _date_to_days, _time_to_micros, translate
-from ibis_substrait.proto.substrait.ibis import algebra_pb2 as stalg
-from ibis_substrait.proto.substrait.ibis import type_pb2 as stt
 
 NULLABILITY_NULLABLE = stt.Type.Nullability.NULLABILITY_NULLABLE