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

Issue:
Add TPC-H query compilation + validation tests
Adds in compilation tests for all 22 TPC-H queries and also runs the substrait-validator against the output.

Currently silencing several warnings in the validator, we can look into those more closely to figure out which, if any, we care deeply about.

This will fail to pass CI until Ibis 3.1 is released.


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index b83ec5e9..43d4ac44 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -88,9 +88,6 @@ jobs:
           - "3.8"
           - "3.9"
           - "3.10"
-        ibis-version:
-          - "2.1.1"
-          - "^3.0.2"
 
     steps:
       - uses: actions/checkout@v3
@@ -100,7 +97,6 @@ jobs:
           python-version: ${{ matrix.python-version }}
 
       - run: pip3 install poetry
-      - run: poetry add ibis-framework=${{ matrix.ibis-version }}
       - run: poetry install
       - run: poetry run pytest
   dry-run-release:
diff --git a/ibis_substrait/compiler/core.py b/ibis_substrait/compiler/core.py
index 7e33decf..7c68d15e 100644
--- a/ibis_substrait/compiler/core.py
+++ b/ibis_substrait/compiler/core.py
@@ -9,9 +9,9 @@
 import ibis.expr.datatypes as dt
 import ibis.expr.types as ir
 
-from ..proto.substrait import algebra_pb2 as stalg
-from ..proto.substrait import plan_pb2 as stp
-from ..proto.substrait.extensions import extensions_pb2 as ste
+from ..proto.substrait.ibis import algebra_pb2 as stalg
+from ..proto.substrait.ibis import plan_pb2 as stp
+from ..proto.substrait.ibis.extensions import extensions_pb2 as ste
 from .mapping import IBIS_SUBSTRAIT_OP_MAPPING
 
 
@@ -143,13 +143,13 @@ def _get_fields(dtype: dt.DataType) -> Iterator[tuple[str | None, dt.DataType]]:
     Examples
     --------
     >>> import ibis.expr.datatypes as dt
-    >>> array_type = dt.parse_type("array<int64>")
+    >>> array_type = dt.parse("array<int64>")
     >>> list(_get_fields(array_type))  # doctest: +SKIP
     [(None, int64)]
-    >>> map_type = dt.parse_type("map<string, string>")
+    >>> map_type = dt.parse("map<string, string>")
     >>> list(_get_fields(map_type))
     [(None, String(nullable=True)), (None, String(nullable=True))]
-    >>> struct_type = dt.parse_type("struct<a: int64, b: map<int64, float64>>")
+    >>> struct_type = dt.parse("struct<a: int64, b: map<int64, float64>>")
     >>> list(_get_fields(struct_type))  # doctest: +SKIP
     [('b', Map(key_type=int64, value_type=float64, nullable=True)), ('a', int64)]
     """
diff --git a/ibis_substrait/compiler/decompile.py b/ibis_substrait/compiler/decompile.py
index bc5f2501..ff6f0fac 100644
--- a/ibis_substrait/compiler/decompile.py
+++ b/ibis_substrait/compiler/decompile.py
@@ -21,9 +21,9 @@
 import pytz
 import toolz
 
-from ..proto.substrait import algebra_pb2 as stalg
-from ..proto.substrait import plan_pb2 as stp
-from ..proto.substrait import type_pb2 as stt
+from ..proto.substrait.ibis import algebra_pb2 as stalg
+from ..proto.substrait.ibis import plan_pb2 as stp
+from ..proto.substrait.ibis import type_pb2 as stt
 from .core import SubstraitDecompiler, _get_fields, which_one_of
 from .mapping import SUBSTRAIT_IBIS_OP_MAPPING
 from .translate import _MICROSECONDS_PER_SECOND, _MINUTES_PER_HOUR, _SECONDS_PER_MINUTE
@@ -453,7 +453,7 @@ def _remove_names_below(names: Deque[str], dtype: dt.DataType) -> None:
     >>> import ibis.expr.datatypes as dt
     >>> typestr = "struct<b: struct<c: int64, d: struct<e: float64>>>"
     >>> schema = ibis.schema([("a", typestr), ("f", "string")])
-    >>> dtype = dt.parse_type(typestr)
+    >>> dtype = dt.parse(typestr)
     >>> flat_names = deque(["a", "b", "c", "d", "e", "f"])
     >>> field_name = flat_names.popleft()
     >>> _remove_names_below(flat_names, dtype)
diff --git a/ibis_substrait/compiler/translate.py b/ibis_substrait/compiler/translate.py
index 753e26f1..b2c34f77 100644
--- a/ibis_substrait/compiler/translate.py
+++ b/ibis_substrait/compiler/translate.py
@@ -23,8 +23,8 @@
 from ibis import util
 from packaging import version
 
-from ..proto.substrait import algebra_pb2 as stalg
-from ..proto.substrait import type_pb2 as stt
+from ..proto.substrait.ibis import algebra_pb2 as stalg
+from ..proto.substrait.ibis import type_pb2 as stt
 from .core import SubstraitCompiler, _get_fields
 
 T = TypeVar("T")
diff --git a/ibis_substrait/proto/substrait/__init__.pyi b/ibis_substrait/proto/substrait/__init__.pyi
index b96c56f6..5b8fefd9 100644
--- a/ibis_substrait/proto/substrait/__init__.pyi
+++ b/ibis_substrait/proto/substrait/__init__.pyi
@@ -1,8 +1,1 @@
-from . import extensions
-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
+from . import ibis
diff --git a/ibis_substrait/proto/substrait/algebra_pb2.py b/ibis_substrait/proto/substrait/algebra_pb2.py
deleted file mode 100644
index 8518b97f..00000000
--- a/ibis_substrait/proto/substrait/algebra_pb2.py
+++ /dev/null
@@ -1,461 +0,0 @@
-"""Generated protocol buffer code."""
-from google.protobuf.internal import enum_type_wrapper
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-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 google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
-from ..substrait.extensions import extensions_pb2 as substrait_dot_extensions_dot_extensions__pb2
-from ..substrait import type_pb2 as substrait_dot_type__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17substrait/algebra.proto\x12\tsubstrait\x1a\x19google/protobuf/any.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%substrait/extensions/extensions.proto\x1a\x14substrait/type.proto"\xb2\x06\n\tRelCommon\x125\n\x06direct\x18\x01 \x01(\x0b2\x1b.substrait.RelCommon.DirectH\x00R\x06direct\x12/\n\x04emit\x18\x02 \x01(\x0b2\x19.substrait.RelCommon.EmitH\x00R\x04emit\x12-\n\x04hint\x18\x03 \x01(\x0b2\x19.substrait.RelCommon.HintR\x04hint\x12V\n\x12advanced_extension\x18\x04 \x01(\x0b2\'.substrait.extensions.AdvancedExtensionR\x11advancedExtension\x1a\x08\n\x06Direct\x1a-\n\x04Emit\x12%\n\x0eoutput_mapping\x18\x01 \x03(\x05R\routputMapping\x1a\xef\x03\n\x04Hint\x125\n\x05stats\x18\x01 \x01(\x0b2\x1f.substrait.RelCommon.Hint.StatsR\x05stats\x12K\n\nconstraint\x18\x02 \x01(\x0b2+.substrait.RelCommon.Hint.RuntimeConstraintR\nconstraint\x12V\n\x12advanced_extension\x18\n \x01(\x0b2\'.substrait.extensions.AdvancedExtensionR\x11advancedExtension\x1a\x9d\x01\n\x05Stats\x12\x1b\n\trow_count\x18\x01 \x01(\x01R\x08rowCount\x12\x1f\n\x0brecord_size\x18\x02 \x01(\x01R\nrecordSize\x12V\n\x12advanced_extension\x18\n \x01(\x0b2\'.substrait.extensions.AdvancedExtensionR\x11advancedExtension\x1ak\n\x11RuntimeConstraint\x12V\n\x12advanced_extension\x18\n \x01(\x0b2\'.substrait.extensions.AdvancedExtensionR\x11advancedExtensionB\x0b\n\temit_kind"\x96\r\n\x07ReadRel\x12,\n\x06common\x18\x01 \x01(\x0b2\x14.substrait.RelCommonR\x06common\x127\n\x0bbase_schema\x18\x02 \x01(\x0b2\x16.substrait.NamedStructR\nbaseSchema\x12-\n\x06filter\x18\x03 \x01(\x0b2\x15.substrait.ExpressionR\x06filter\x12D\n\nprojection\x18\x04 \x01(\x0b2$.substrait.Expression.MaskExpressionR\nprojection\x12V\n\x12advanced_extension\x18\n \x01(\x0b2\'.substrait.extensions.AdvancedExtensionR\x11advancedExtension\x12F\n\rvirtual_table\x18\x05 \x01(\x0b2\x1f.substrait.ReadRel.VirtualTableH\x00R\x0cvirtualTable\x12@\n\x0blocal_files\x18\x06 \x01(\x0b2\x1d.substrait.ReadRel.LocalFilesH\x00R\nlocalFiles\x12@\n\x0bnamed_table\x18\x07 \x01(\x0b2\x1d.substrait.ReadRel.NamedTableH\x00R\nnamedTable\x12L\n\x0fextension_table\x18\x08 \x01(\x0b2!.substrait.ReadRel.ExtensionTableH\x00R\x0eextensionTable\x1az\n\nNamedTable\x12\x14\n\x05names\x18\x01 \x03(\tR\x05names\x12V\n\x12advanced_extension\x18\n \x01(\x0b2\'.substrait.extensions.AdvancedExtensionR\x11advancedExtension\x1aL\n\x0cVirtualTable\x12<\n\x06values\x18\x01 \x03(\x0b2$.substrait.Expression.Literal.StructR\x06values\x1a>\n\x0eExtensionTable\x12,\n\x06detail\x18\x01 \x01(\x0b2\x14.google.protobuf.AnyR\x06detail\x1a\xa5\x06\n\nLocalFiles\x12?\n\x05items\x18\x01 \x03(\x0b2).substrait.ReadRel.LocalFiles.FileOrFilesR\x05items\x12V\n\x12advanced_extension\x18\n \x01(\x0b2\'.substrait.extensions.AdvancedExtensionR\x11advancedExtension\x1a\xfd\x04\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\x12X\n\x07parquet\x18\t \x01(\x0b2<.substrait.ReadRel.LocalFiles.FileOrFiles.ParquetReadOptionsH\x01R\x07parquet\x12R\n\x05arrow\x18\n \x01(\x0b2:.substrait.ReadRel.LocalFiles.FileOrFiles.ArrowReadOptionsH\x01R\x05arrow\x12L\n\x03orc\x18\x0b \x01(\x0b28.substrait.ReadRel.LocalFiles.FileOrFiles.OrcReadOptionsH\x01R\x03orc\x124\n\textension\x18\x0c \x01(\x0b2\x14.google.protobuf.AnyH\x01R\textension\x1a\x14\n\x12ParquetReadOptions\x1a\x12\n\x10ArrowReadOptions\x1a\x10\n\x0eOrcReadOptionsB\x0b\n\tpath_typeB\r\n\x0bfile_formatJ\x04\x08\x05\x10\x06R\x06formatB\x0b\n\tread_type"\xf1\x01\n\nProjectRel\x12,\n\x06common\x18\x01 \x01(\x0b2\x14.substrait.RelCommonR\x06common\x12$\n\x05input\x18\x02 \x01(\x0b2\x0e.substrait.RelR\x05input\x127\n\x0bexpressions\x18\x03 \x03(\x0b2\x15.substrait.ExpressionR\x0bexpressions\x12V\n\x12advanced_extension\x18\n \x01(\x0b2\'.substrait.extensions.AdvancedExtensionR\x11advancedExtension"\xbb\x04\n\x07JoinRel\x12,\n\x06common\x18\x01 \x01(\x0b2\x14.substrait.RelCommonR\x06common\x12"\n\x04left\x18\x02 \x01(\x0b2\x0e.substrait.RelR\x04left\x12$\n\x05right\x18\x03 \x01(\x0b2\x0e.substrait.RelR\x05right\x125\n\nexpression\x18\x04 \x01(\x0b2\x15.substrait.ExpressionR\nexpression\x12?\n\x10post_join_filter\x18\x05 \x01(\x0b2\x15.substrait.ExpressionR\x0epostJoinFilter\x12/\n\x04type\x18\x06 \x01(\x0e2\x1b.substrait.JoinRel.JoinTypeR\x04type\x12V\n\x12advanced_extension\x18\n \x01(\x0b2\'.substrait.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"\xda\x01\n\x08CrossRel\x12,\n\x06common\x18\x01 \x01(\x0b2\x14.substrait.RelCommonR\x06common\x12"\n\x04left\x18\x02 \x01(\x0b2\x0e.substrait.RelR\x04left\x12$\n\x05right\x18\x03 \x01(\x0b2\x0e.substrait.RelR\x05right\x12V\n\x12advanced_extension\x18\n \x01(\x0b2\'.substrait.extensions.AdvancedExtensionR\x11advancedExtension"\xe4\x01\n\x08FetchRel\x12,\n\x06common\x18\x01 \x01(\x0b2\x14.substrait.RelCommonR\x06common\x12$\n\x05input\x18\x02 \x01(\x0b2\x0e.substrait.RelR\x05input\x12\x16\n\x06offset\x18\x03 \x01(\x03R\x06offset\x12\x14\n\x05count\x18\x04 \x01(\x03R\x05count\x12V\n\x12advanced_extension\x18\n \x01(\x0b2\'.substrait.extensions.AdvancedExtensionR\x11advancedExtension"\xff\x03\n\x0cAggregateRel\x12,\n\x06common\x18\x01 \x01(\x0b2\x14.substrait.RelCommonR\x06common\x12$\n\x05input\x18\x02 \x01(\x0b2\x0e.substrait.RelR\x05input\x12>\n\tgroupings\x18\x03 \x03(\x0b2 .substrait.AggregateRel.GroupingR\tgroupings\x12;\n\x08measures\x18\x04 \x03(\x0b2\x1f.substrait.AggregateRel.MeasureR\x08measures\x12V\n\x12advanced_extension\x18\n \x01(\x0b2\'.substrait.extensions.AdvancedExtensionR\x11advancedExtension\x1aT\n\x08Grouping\x12H\n\x14grouping_expressions\x18\x01 \x03(\x0b2\x15.substrait.ExpressionR\x13groupingExpressions\x1ap\n\x07Measure\x126\n\x07measure\x18\x01 \x01(\x0b2\x1c.substrait.AggregateFunctionR\x07measure\x12-\n\x06filter\x18\x02 \x01(\x0b2\x15.substrait.ExpressionR\x06filter"\xe1\x01\n\x07SortRel\x12,\n\x06common\x18\x01 \x01(\x0b2\x14.substrait.RelCommonR\x06common\x12$\n\x05input\x18\x02 \x01(\x0b2\x0e.substrait.RelR\x05input\x12*\n\x05sorts\x18\x03 \x03(\x0b2\x14.substrait.SortFieldR\x05sorts\x12V\n\x12advanced_extension\x18\n \x01(\x0b2\'.substrait.extensions.AdvancedExtensionR\x11advancedExtension"\xec\x01\n\tFilterRel\x12,\n\x06common\x18\x01 \x01(\x0b2\x14.substrait.RelCommonR\x06common\x12$\n\x05input\x18\x02 \x01(\x0b2\x0e.substrait.RelR\x05input\x123\n\tcondition\x18\x03 \x01(\x0b2\x15.substrait.ExpressionR\tcondition\x12V\n\x12advanced_extension\x18\n \x01(\x0b2\'.substrait.extensions.AdvancedExtensionR\x11advancedExtension"\xaa\x03\n\x06SetRel\x12,\n\x06common\x18\x01 \x01(\x0b2\x14.substrait.RelCommonR\x06common\x12&\n\x06inputs\x18\x02 \x03(\x0b2\x0e.substrait.RelR\x06inputs\x12\'\n\x02op\x18\x03 \x01(\x0e2\x17.substrait.SetRel.SetOpR\x02op\x12V\n\x12advanced_extension\x18\n \x01(\x0b2\'.substrait.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"\x96\x01\n\x12ExtensionSingleRel\x12,\n\x06common\x18\x01 \x01(\x0b2\x14.substrait.RelCommonR\x06common\x12$\n\x05input\x18\x02 \x01(\x0b2\x0e.substrait.RelR\x05input\x12,\n\x06detail\x18\x03 \x01(\x0b2\x14.google.protobuf.AnyR\x06detail"n\n\x10ExtensionLeafRel\x12,\n\x06common\x18\x01 \x01(\x0b2\x14.substrait.RelCommonR\x06common\x12,\n\x06detail\x18\x02 \x01(\x0b2\x14.google.protobuf.AnyR\x06detail"\x97\x01\n\x11ExtensionMultiRel\x12,\n\x06common\x18\x01 \x01(\x0b2\x14.substrait.RelCommonR\x06common\x12&\n\x06inputs\x18\x02 \x03(\x0b2\x0e.substrait.RelR\x06inputs\x12,\n\x06detail\x18\x03 \x01(\x0b2\x14.google.protobuf.AnyR\x06detail"\x9a\t\n\x0bExchangeRel\x12,\n\x06common\x18\x01 \x01(\x0b2\x14.substrait.RelCommonR\x06common\x12$\n\x05input\x18\x02 \x01(\x0b2\x0e.substrait.RelR\x05input\x12\'\n\x0fpartition_count\x18\x03 \x01(\x05R\x0epartitionCount\x12?\n\x07targets\x18\x04 \x03(\x0b2%.substrait.ExchangeRel.ExchangeTargetR\x07targets\x12R\n\x11scatter_by_fields\x18\x05 \x01(\x0b2$.substrait.ExchangeRel.ScatterFieldsH\x00R\x0fscatterByFields\x12T\n\rsingle_target\x18\x06 \x01(\x0b2-.substrait.ExchangeRel.SingleBucketExpressionH\x00R\x0csingleTarget\x12Q\n\x0cmulti_target\x18\x07 \x01(\x0b2,.substrait.ExchangeRel.MultiBucketExpressionH\x00R\x0bmultiTarget\x12D\n\x0bround_robin\x18\x08 \x01(\x0b2!.substrait.ExchangeRel.RoundRobinH\x00R\nroundRobin\x12@\n\tbroadcast\x18\t \x01(\x0b2 .substrait.ExchangeRel.BroadcastH\x00R\tbroadcast\x12V\n\x12advanced_extension\x18\n \x01(\x0b2\'.substrait.extensions.AdvancedExtensionR\x11advancedExtension\x1aM\n\rScatterFields\x12<\n\x06fields\x18\x01 \x03(\x0b2$.substrait.Expression.FieldReferenceR\x06fields\x1aO\n\x16SingleBucketExpression\x125\n\nexpression\x18\x01 \x01(\x0b2\x15.substrait.ExpressionR\nexpression\x1a\x80\x01\n\x15MultiBucketExpression\x125\n\nexpression\x18\x01 \x01(\x0b2\x15.substrait.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"E\n\x07RelRoot\x12$\n\x05input\x18\x01 \x01(\x0b2\x0e.substrait.RelR\x05input\x12\x14\n\x05names\x18\x02 \x03(\tR\x05names"\x87\x05\n\x03Rel\x12(\n\x04read\x18\x01 \x01(\x0b2\x12.substrait.ReadRelH\x00R\x04read\x12.\n\x06filter\x18\x02 \x01(\x0b2\x14.substrait.FilterRelH\x00R\x06filter\x12+\n\x05fetch\x18\x03 \x01(\x0b2\x13.substrait.FetchRelH\x00R\x05fetch\x127\n\taggregate\x18\x04 \x01(\x0b2\x17.substrait.AggregateRelH\x00R\taggregate\x12(\n\x04sort\x18\x05 \x01(\x0b2\x12.substrait.SortRelH\x00R\x04sort\x12(\n\x04join\x18\x06 \x01(\x0b2\x12.substrait.JoinRelH\x00R\x04join\x121\n\x07project\x18\x07 \x01(\x0b2\x15.substrait.ProjectRelH\x00R\x07project\x12%\n\x03set\x18\x08 \x01(\x0b2\x11.substrait.SetRelH\x00R\x03set\x12J\n\x10extension_single\x18\t \x01(\x0b2\x1d.substrait.ExtensionSingleRelH\x00R\x0fextensionSingle\x12G\n\x0fextension_multi\x18\n \x01(\x0b2\x1c.substrait.ExtensionMultiRelH\x00R\x0eextensionMulti\x12D\n\x0eextension_leaf\x18\x0b \x01(\x0b2\x1b.substrait.ExtensionLeafRelH\x00R\rextensionLeaf\x12+\n\x05cross\x18\x0c \x01(\x0b2\x13.substrait.CrossRelH\x00R\x05crossB\n\n\x08rel_type"\x9d\x02\n\x10FunctionArgument\x126\n\x04enum\x18\x01 \x01(\x0b2 .substrait.FunctionArgument.EnumH\x00R\x04enum\x12%\n\x04type\x18\x02 \x01(\x0b2\x0f.substrait.TypeH\x00R\x04type\x12-\n\x05value\x18\x03 \x01(\x0b2\x15.substrait.ExpressionH\x00R\x05value\x1ao\n\x04Enum\x12\x1e\n\tspecified\x18\x01 \x01(\tH\x00R\tspecified\x12:\n\x0bunspecified\x18\x02 \x01(\x0b2\x16.google.protobuf.EmptyH\x00R\x0bunspecifiedB\x0b\n\tenum_kindB\n\n\x08arg_type"\xffK\n\nExpression\x129\n\x07literal\x18\x01 \x01(\x0b2\x1d.substrait.Expression.LiteralH\x00R\x07literal\x12D\n\tselection\x18\x02 \x01(\x0b2$.substrait.Expression.FieldReferenceH\x00R\tselection\x12O\n\x0fscalar_function\x18\x03 \x01(\x0b2$.substrait.Expression.ScalarFunctionH\x00R\x0escalarFunction\x12O\n\x0fwindow_function\x18\x05 \x01(\x0b2$.substrait.Expression.WindowFunctionH\x00R\x0ewindowFunction\x127\n\x07if_then\x18\x06 \x01(\x0b2\x1c.substrait.Expression.IfThenH\x00R\x06ifThen\x12U\n\x11switch_expression\x18\x07 \x01(\x0b2&.substrait.Expression.SwitchExpressionH\x00R\x10switchExpression\x12P\n\x10singular_or_list\x18\x08 \x01(\x0b2$.substrait.Expression.SingularOrListH\x00R\x0esingularOrList\x12G\n\rmulti_or_list\x18\t \x01(\x0b2!.substrait.Expression.MultiOrListH\x00R\x0bmultiOrList\x120\n\x04cast\x18\x0b \x01(\x0b2\x1a.substrait.Expression.CastH\x00R\x04cast\x12<\n\x08subquery\x18\x0c \x01(\x0b2\x1e.substrait.Expression.SubqueryH\x00R\x08subquery\x124\n\x04enum\x18\n \x01(\x0b2\x1a.substrait.Expression.EnumB\x02\x18\x01H\x00R\x04enum\x1a\x8a\x01\n\x04Enum\x12\x1e\n\tspecified\x18\x01 \x01(\tH\x00R\tspecified\x12D\n\x0bunspecified\x18\x02 \x01(\x0b2 .substrait.Expression.Enum.EmptyH\x00R\x0bunspecified\x1a\x0b\n\x05Empty:\x02\x18\x01:\x02\x18\x01B\x0b\n\tenum_kind\x1a\x9c\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\x12h\n\x16interval_year_to_month\x18\x13 \x01(\x0b21.substrait.Expression.Literal.IntervalYearToMonthH\x00R\x13intervalYearToMonth\x12h\n\x16interval_day_to_second\x18\x14 \x01(\x0b21.substrait.Expression.Literal.IntervalDayToSecondH\x00R\x13intervalDayToSecond\x12\x1f\n\nfixed_char\x18\x15 \x01(\tH\x00R\tfixedChar\x12B\n\x08var_char\x18\x16 \x01(\x0b2%.substrait.Expression.Literal.VarCharH\x00R\x07varChar\x12#\n\x0cfixed_binary\x18\x17 \x01(\x0cH\x00R\x0bfixedBinary\x12A\n\x07decimal\x18\x18 \x01(\x0b2%.substrait.Expression.Literal.DecimalH\x00R\x07decimal\x12>\n\x06struct\x18\x19 \x01(\x0b2$.substrait.Expression.Literal.StructH\x00R\x06struct\x125\n\x03map\x18\x1a \x01(\x0b2!.substrait.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\x0f.substrait.TypeH\x00R\x04null\x128\n\x04list\x18\x1e \x01(\x0b2".substrait.Expression.Literal.ListH\x00R\x04list\x125\n\nempty_list\x18\x1f \x01(\x0b2\x14.substrait.Type.ListH\x00R\temptyList\x122\n\tempty_map\x18  \x01(\x0b2\x13.substrait.Type.MapH\x00R\x08emptyMap\x12N\n\x0cuser_defined\x18! \x01(\x0b2).substrait.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\xc2\x01\n\x03Map\x12I\n\nkey_values\x18\x01 \x03(\x0b2*.substrait.Expression.Literal.Map.KeyValueR\tkeyValues\x1ap\n\x08KeyValue\x12/\n\x03key\x18\x01 \x01(\x0b2\x1d.substrait.Expression.LiteralR\x03key\x123\n\x05value\x18\x02 \x01(\x0b2\x1d.substrait.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\x1a?\n\x06Struct\x125\n\x06fields\x18\x01 \x03(\x0b2\x1d.substrait.Expression.LiteralR\x06fields\x1a=\n\x04List\x125\n\x06values\x18\x01 \x03(\x0b2\x1d.substrait.Expression.LiteralR\x06values\x1a\xa4\x01\n\x0bUserDefined\x12%\n\x0etype_reference\x18\x01 \x01(\rR\rtypeReference\x12B\n\x0ftype_parameters\x18\x03 \x03(\x0b2\x19.substrait.Type.ParameterR\x0etypeParameters\x12*\n\x05value\x18\x02 \x01(\x0b2\x14.google.protobuf.AnyR\x05valueB\x0e\n\x0cliteral_type\x1a\xdb\x01\n\x0eScalarFunction\x12-\n\x12function_reference\x18\x01 \x01(\rR\x11functionReference\x129\n\targuments\x18\x04 \x03(\x0b2\x1b.substrait.FunctionArgumentR\targuments\x120\n\x0boutput_type\x18\x03 \x01(\x0b2\x0f.substrait.TypeR\noutputType\x12-\n\x04args\x18\x02 \x03(\x0b2\x15.substrait.ExpressionB\x02\x18\x01R\x04args\x1a\xde\x07\n\x0eWindowFunction\x12-\n\x12function_reference\x18\x01 \x01(\rR\x11functionReference\x125\n\npartitions\x18\x02 \x03(\x0b2\x15.substrait.ExpressionR\npartitions\x12*\n\x05sorts\x18\x03 \x03(\x0b2\x14.substrait.SortFieldR\x05sorts\x12K\n\x0bupper_bound\x18\x04 \x01(\x0b2*.substrait.Expression.WindowFunction.BoundR\nupperBound\x12K\n\x0blower_bound\x18\x05 \x01(\x0b2*.substrait.Expression.WindowFunction.BoundR\nlowerBound\x121\n\x05phase\x18\x06 \x01(\x0e2\x1b.substrait.AggregationPhaseR\x05phase\x120\n\x0boutput_type\x18\x07 \x01(\x0b2\x0f.substrait.TypeR\noutputType\x129\n\targuments\x18\t \x03(\x0b2\x1b.substrait.FunctionArgumentR\targuments\x12-\n\x04args\x18\x08 \x03(\x0b2\x15.substrait.ExpressionB\x02\x18\x01R\x04args\x1a\xd0\x03\n\x05Bound\x12T\n\tpreceding\x18\x01 \x01(\x0b24.substrait.Expression.WindowFunction.Bound.PrecedingH\x00R\tpreceding\x12T\n\tfollowing\x18\x02 \x01(\x0b24.substrait.Expression.WindowFunction.Bound.FollowingH\x00R\tfollowing\x12X\n\x0bcurrent_row\x18\x03 \x01(\x0b25.substrait.Expression.WindowFunction.Bound.CurrentRowH\x00R\ncurrentRow\x12T\n\tunbounded\x18\x04 \x01(\x0b24.substrait.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\xca\x01\n\x06IfThen\x127\n\x03ifs\x18\x01 \x03(\x0b2%.substrait.Expression.IfThen.IfClauseR\x03ifs\x12)\n\x04else\x18\x02 \x01(\x0b2\x15.substrait.ExpressionR\x04else\x1a\\\n\x08IfClause\x12%\n\x02if\x18\x01 \x01(\x0b2\x15.substrait.ExpressionR\x02if\x12)\n\x04then\x18\x02 \x01(\x0b2\x15.substrait.ExpressionR\x04then\x1a\xac\x02\n\x04Cast\x12#\n\x04type\x18\x01 \x01(\x0b2\x0f.substrait.TypeR\x04type\x12+\n\x05input\x18\x02 \x01(\x0b2\x15.substrait.ExpressionR\x05input\x12U\n\x10failure_behavior\x18\x03 \x01(\x0e2*.substrait.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\x91\x02\n\x10SwitchExpression\x12+\n\x05match\x18\x03 \x01(\x0b2\x15.substrait.ExpressionR\x05match\x12@\n\x03ifs\x18\x01 \x03(\x0b2..substrait.Expression.SwitchExpression.IfValueR\x03ifs\x12)\n\x04else\x18\x02 \x01(\x0b2\x15.substrait.ExpressionR\x04else\x1ac\n\x07IfValue\x12-\n\x02if\x18\x01 \x01(\x0b2\x1d.substrait.Expression.LiteralR\x02if\x12)\n\x04then\x18\x02 \x01(\x0b2\x15.substrait.ExpressionR\x04then\x1an\n\x0eSingularOrList\x12+\n\x05value\x18\x01 \x01(\x0b2\x15.substrait.ExpressionR\x05value\x12/\n\x07options\x18\x02 \x03(\x0b2\x15.substrait.ExpressionR\x07options\x1a\xb7\x01\n\x0bMultiOrList\x12+\n\x05value\x18\x01 \x03(\x0b2\x15.substrait.ExpressionR\x05value\x12B\n\x07options\x18\x02 \x03(\x0b2(.substrait.Expression.MultiOrList.RecordR\x07options\x1a7\n\x06Record\x12-\n\x06fields\x18\x01 \x03(\x0b2\x15.substrait.ExpressionR\x06fields\x1a\x93\x04\n\x10EmbeddedFunction\x123\n\targuments\x18\x01 \x03(\x0b2\x15.substrait.ExpressionR\targuments\x120\n\x0boutput_type\x18\x02 \x01(\x0b2\x0f.substrait.TypeR\noutputType\x12s\n\x16python_pickle_function\x18\x03 \x01(\x0b2;.substrait.Expression.EmbeddedFunction.PythonPickleFunctionH\x00R\x14pythonPickleFunction\x12p\n\x15web_assembly_function\x18\x04 \x01(\x0b2:.substrait.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\xe8\x04\n\x10ReferenceSegment\x12H\n\x07map_key\x18\x01 \x01(\x0b2-.substrait.Expression.ReferenceSegment.MapKeyH\x00R\x06mapKey\x12W\n\x0cstruct_field\x18\x02 \x01(\x0b22.substrait.Expression.ReferenceSegment.StructFieldH\x00R\x0bstructField\x12W\n\x0clist_element\x18\x03 \x01(\x0b22.substrait.Expression.ReferenceSegment.ListElementH\x00R\x0blistElement\x1a~\n\x06MapKey\x126\n\x07map_key\x18\x01 \x01(\x0b2\x1d.substrait.Expression.LiteralR\x06mapKey\x12<\n\x05child\x18\x02 \x01(\x0b2&.substrait.Expression.ReferenceSegmentR\x05child\x1aa\n\x0bStructField\x12\x14\n\x05field\x18\x01 \x01(\x05R\x05field\x12<\n\x05child\x18\x02 \x01(\x0b2&.substrait.Expression.ReferenceSegmentR\x05child\x1ac\n\x0bListElement\x12\x16\n\x06offset\x18\x01 \x01(\x05R\x06offset\x12<\n\x05child\x18\x02 \x01(\x0b2&.substrait.Expression.ReferenceSegmentR\x05childB\x10\n\x0ereference_type\x1a\xa2\x0b\n\x0eMaskExpression\x12I\n\x06select\x18\x01 \x01(\x0b21.substrait.Expression.MaskExpression.StructSelectR\x06select\x128\n\x18maintain_singular_struct\x18\x02 \x01(\x08R\x16maintainSingularStruct\x1a\xe8\x01\n\x06Select\x12K\n\x06struct\x18\x01 \x01(\x0b21.substrait.Expression.MaskExpression.StructSelectH\x00R\x06struct\x12E\n\x04list\x18\x02 \x01(\x0b2/.substrait.Expression.MaskExpression.ListSelectH\x00R\x04list\x12B\n\x03map\x18\x03 \x01(\x0b2..substrait.Expression.MaskExpression.MapSelectH\x00R\x03mapB\x06\n\x04type\x1ab\n\x0cStructSelect\x12R\n\x0cstruct_items\x18\x01 \x03(\x0b2/.substrait.Expression.MaskExpression.StructItemR\x0bstructItems\x1ae\n\nStructItem\x12\x14\n\x05field\x18\x01 \x01(\x05R\x05field\x12A\n\x05child\x18\x02 \x01(\x0b2+.substrait.Expression.MaskExpression.SelectR\x05child\x1a\xe6\x03\n\nListSelect\x12\\\n\tselection\x18\x01 \x03(\x0b2>.substrait.Expression.MaskExpression.ListSelect.ListSelectItemR\tselection\x12A\n\x05child\x18\x02 \x01(\x0b2+.substrait.Expression.MaskExpression.SelectR\x05child\x1a\xb6\x02\n\x0eListSelectItem\x12`\n\x04item\x18\x01 \x01(\x0b2J.substrait.Expression.MaskExpression.ListSelect.ListSelectItem.ListElementH\x00R\x04item\x12`\n\x05slice\x18\x02 \x01(\x0b2H.substrait.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\xeb\x02\n\tMapSelect\x12I\n\x03key\x18\x01 \x01(\x0b25.substrait.Expression.MaskExpression.MapSelect.MapKeyH\x00R\x03key\x12a\n\nexpression\x18\x02 \x01(\x0b2?.substrait.Expression.MaskExpression.MapSelect.MapKeyExpressionH\x00R\nexpression\x12A\n\x05child\x18\x03 \x01(\x0b2+.substrait.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\x8d\x04\n\x0eFieldReference\x12S\n\x10direct_reference\x18\x01 \x01(\x0b2&.substrait.Expression.ReferenceSegmentH\x00R\x0fdirectReference\x12Q\n\x10masked_reference\x18\x02 \x01(\x0b2$.substrait.Expression.MaskExpressionH\x00R\x0fmaskedReference\x127\n\nexpression\x18\x03 \x01(\x0b2\x15.substrait.ExpressionH\x01R\nexpression\x12[\n\x0eroot_reference\x18\x04 \x01(\x0b22.substrait.Expression.FieldReference.RootReferenceH\x01R\rrootReference\x12^\n\x0fouter_reference\x18\x05 \x01(\x0b23.substrait.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\x95\n\n\x08Subquery\x12?\n\x06scalar\x18\x01 \x01(\x0b2%.substrait.Expression.Subquery.ScalarH\x00R\x06scalar\x12O\n\x0cin_predicate\x18\x02 \x01(\x0b2*.substrait.Expression.Subquery.InPredicateH\x00R\x0binPredicate\x12R\n\rset_predicate\x18\x03 \x01(\x0b2+.substrait.Expression.Subquery.SetPredicateH\x00R\x0csetPredicate\x12U\n\x0eset_comparison\x18\x04 \x01(\x0b2,.substrait.Expression.Subquery.SetComparisonH\x00R\rsetComparison\x1a.\n\x06Scalar\x12$\n\x05input\x18\x01 \x01(\x0b2\x0e.substrait.RelR\x05input\x1aj\n\x0bInPredicate\x12/\n\x07needles\x18\x01 \x03(\x0b2\x15.substrait.ExpressionR\x07needles\x12*\n\x08haystack\x18\x02 \x01(\x0b2\x0e.substrait.RelR\x08haystack\x1a\xf1\x01\n\x0cSetPredicate\x12Z\n\x0cpredicate_op\x18\x01 \x01(\x0e27.substrait.Expression.Subquery.SetPredicate.PredicateOpR\x0bpredicateOp\x12&\n\x06tuples\x18\x02 \x01(\x0b2\x0e.substrait.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\xaa\x04\n\rSetComparison\x12[\n\x0creduction_op\x18\x01 \x01(\x0e28.substrait.Expression.Subquery.SetComparison.ReductionOpR\x0breductionOp\x12^\n\rcomparison_op\x18\x02 \x01(\x0e29.substrait.Expression.Subquery.SetComparison.ComparisonOpR\x0ccomparisonOp\x12)\n\x04left\x18\x03 \x01(\x0b2\x15.substrait.ExpressionR\x04left\x12$\n\x05right\x18\x04 \x01(\x0b2\x0e.substrait.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"\xad\x03\n\tSortField\x12)\n\x04expr\x18\x01 \x01(\x0b2\x15.substrait.ExpressionR\x04expr\x12B\n\tdirection\x18\x02 \x01(\x0e2".substrait.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"\x98\x04\n\x11AggregateFunction\x12-\n\x12function_reference\x18\x01 \x01(\rR\x11functionReference\x129\n\targuments\x18\x07 \x03(\x0b2\x1b.substrait.FunctionArgumentR\targuments\x12*\n\x05sorts\x18\x03 \x03(\x0b2\x14.substrait.SortFieldR\x05sorts\x121\n\x05phase\x18\x04 \x01(\x0e2\x1b.substrait.AggregationPhaseR\x05phase\x120\n\x0boutput_type\x18\x05 \x01(\x0b2\x0f.substrait.TypeR\noutputType\x12R\n\ninvocation\x18\x06 \x01(\x0e22.substrait.AggregateFunction.AggregationInvocationR\ninvocation\x12-\n\x04args\x18\x02 \x03(\x0b2\x15.substrait.ExpressionB\x02\x18\x01R\x04args"\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\x04BW\n\x12io.substrait.protoP\x01Z*github.com/substrait-io/substrait-go/proto\xaa\x02\x12Substrait.Protobufb\x06proto3')
-_AGGREGATIONPHASE = DESCRIPTOR.enum_types_by_name['AggregationPhase']
-AggregationPhase = enum_type_wrapper.EnumTypeWrapper(_AGGREGATIONPHASE)
-AGGREGATION_PHASE_UNSPECIFIED = 0
-AGGREGATION_PHASE_INITIAL_TO_INTERMEDIATE = 1
-AGGREGATION_PHASE_INTERMEDIATE_TO_INTERMEDIATE = 2
-AGGREGATION_PHASE_INITIAL_TO_RESULT = 3
-AGGREGATION_PHASE_INTERMEDIATE_TO_RESULT = 4
-_RELCOMMON = DESCRIPTOR.message_types_by_name['RelCommon']
-_RELCOMMON_DIRECT = _RELCOMMON.nested_types_by_name['Direct']
-_RELCOMMON_EMIT = _RELCOMMON.nested_types_by_name['Emit']
-_RELCOMMON_HINT = _RELCOMMON.nested_types_by_name['Hint']
-_RELCOMMON_HINT_STATS = _RELCOMMON_HINT.nested_types_by_name['Stats']
-_RELCOMMON_HINT_RUNTIMECONSTRAINT = _RELCOMMON_HINT.nested_types_by_name['RuntimeConstraint']
-_READREL = DESCRIPTOR.message_types_by_name['ReadRel']
-_READREL_NAMEDTABLE = _READREL.nested_types_by_name['NamedTable']
-_READREL_VIRTUALTABLE = _READREL.nested_types_by_name['VirtualTable']
-_READREL_EXTENSIONTABLE = _READREL.nested_types_by_name['ExtensionTable']
-_READREL_LOCALFILES = _READREL.nested_types_by_name['LocalFiles']
-_READREL_LOCALFILES_FILEORFILES = _READREL_LOCALFILES.nested_types_by_name['FileOrFiles']
-_READREL_LOCALFILES_FILEORFILES_PARQUETREADOPTIONS = _READREL_LOCALFILES_FILEORFILES.nested_types_by_name['ParquetReadOptions']
-_READREL_LOCALFILES_FILEORFILES_ARROWREADOPTIONS = _READREL_LOCALFILES_FILEORFILES.nested_types_by_name['ArrowReadOptions']
-_READREL_LOCALFILES_FILEORFILES_ORCREADOPTIONS = _READREL_LOCALFILES_FILEORFILES.nested_types_by_name['OrcReadOptions']
-_PROJECTREL = DESCRIPTOR.message_types_by_name['ProjectRel']
-_JOINREL = DESCRIPTOR.message_types_by_name['JoinRel']
-_CROSSREL = DESCRIPTOR.message_types_by_name['CrossRel']
-_FETCHREL = DESCRIPTOR.message_types_by_name['FetchRel']
-_AGGREGATEREL = DESCRIPTOR.message_types_by_name['AggregateRel']
-_AGGREGATEREL_GROUPING = _AGGREGATEREL.nested_types_by_name['Grouping']
-_AGGREGATEREL_MEASURE = _AGGREGATEREL.nested_types_by_name['Measure']
-_SORTREL = DESCRIPTOR.message_types_by_name['SortRel']
-_FILTERREL = DESCRIPTOR.message_types_by_name['FilterRel']
-_SETREL = DESCRIPTOR.message_types_by_name['SetRel']
-_EXTENSIONSINGLEREL = DESCRIPTOR.message_types_by_name['ExtensionSingleRel']
-_EXTENSIONLEAFREL = DESCRIPTOR.message_types_by_name['ExtensionLeafRel']
-_EXTENSIONMULTIREL = DESCRIPTOR.message_types_by_name['ExtensionMultiRel']
-_EXCHANGEREL = DESCRIPTOR.message_types_by_name['ExchangeRel']
-_EXCHANGEREL_SCATTERFIELDS = _EXCHANGEREL.nested_types_by_name['ScatterFields']
-_EXCHANGEREL_SINGLEBUCKETEXPRESSION = _EXCHANGEREL.nested_types_by_name['SingleBucketExpression']
-_EXCHANGEREL_MULTIBUCKETEXPRESSION = _EXCHANGEREL.nested_types_by_name['MultiBucketExpression']
-_EXCHANGEREL_BROADCAST = _EXCHANGEREL.nested_types_by_name['Broadcast']
-_EXCHANGEREL_ROUNDROBIN = _EXCHANGEREL.nested_types_by_name['RoundRobin']
-_EXCHANGEREL_EXCHANGETARGET = _EXCHANGEREL.nested_types_by_name['ExchangeTarget']
-_RELROOT = DESCRIPTOR.message_types_by_name['RelRoot']
-_REL = DESCRIPTOR.message_types_by_name['Rel']
-_FUNCTIONARGUMENT = DESCRIPTOR.message_types_by_name['FunctionArgument']
-_FUNCTIONARGUMENT_ENUM = _FUNCTIONARGUMENT.nested_types_by_name['Enum']
-_EXPRESSION = DESCRIPTOR.message_types_by_name['Expression']
-_EXPRESSION_ENUM = _EXPRESSION.nested_types_by_name['Enum']
-_EXPRESSION_ENUM_EMPTY = _EXPRESSION_ENUM.nested_types_by_name['Empty']
-_EXPRESSION_LITERAL = _EXPRESSION.nested_types_by_name['Literal']
-_EXPRESSION_LITERAL_VARCHAR = _EXPRESSION_LITERAL.nested_types_by_name['VarChar']
-_EXPRESSION_LITERAL_DECIMAL = _EXPRESSION_LITERAL.nested_types_by_name['Decimal']
-_EXPRESSION_LITERAL_MAP = _EXPRESSION_LITERAL.nested_types_by_name['Map']
-_EXPRESSION_LITERAL_MAP_KEYVALUE = _EXPRESSION_LITERAL_MAP.nested_types_by_name['KeyValue']
-_EXPRESSION_LITERAL_INTERVALYEARTOMONTH = _EXPRESSION_LITERAL.nested_types_by_name['IntervalYearToMonth']
-_EXPRESSION_LITERAL_INTERVALDAYTOSECOND = _EXPRESSION_LITERAL.nested_types_by_name['IntervalDayToSecond']
-_EXPRESSION_LITERAL_STRUCT = _EXPRESSION_LITERAL.nested_types_by_name['Struct']
-_EXPRESSION_LITERAL_LIST = _EXPRESSION_LITERAL.nested_types_by_name['List']
-_EXPRESSION_LITERAL_USERDEFINED = _EXPRESSION_LITERAL.nested_types_by_name['UserDefined']
-_EXPRESSION_SCALARFUNCTION = _EXPRESSION.nested_types_by_name['ScalarFunction']
-_EXPRESSION_WINDOWFUNCTION = _EXPRESSION.nested_types_by_name['WindowFunction']
-_EXPRESSION_WINDOWFUNCTION_BOUND = _EXPRESSION_WINDOWFUNCTION.nested_types_by_name['Bound']
-_EXPRESSION_WINDOWFUNCTION_BOUND_PRECEDING = _EXPRESSION_WINDOWFUNCTION_BOUND.nested_types_by_name['Preceding']
-_EXPRESSION_WINDOWFUNCTION_BOUND_FOLLOWING = _EXPRESSION_WINDOWFUNCTION_BOUND.nested_types_by_name['Following']
-_EXPRESSION_WINDOWFUNCTION_BOUND_CURRENTROW = _EXPRESSION_WINDOWFUNCTION_BOUND.nested_types_by_name['CurrentRow']
-_EXPRESSION_WINDOWFUNCTION_BOUND_UNBOUNDED = _EXPRESSION_WINDOWFUNCTION_BOUND.nested_types_by_name['Unbounded']
-_EXPRESSION_IFTHEN = _EXPRESSION.nested_types_by_name['IfThen']
-_EXPRESSION_IFTHEN_IFCLAUSE = _EXPRESSION_IFTHEN.nested_types_by_name['IfClause']
-_EXPRESSION_CAST = _EXPRESSION.nested_types_by_name['Cast']
-_EXPRESSION_SWITCHEXPRESSION = _EXPRESSION.nested_types_by_name['SwitchExpression']
-_EXPRESSION_SWITCHEXPRESSION_IFVALUE = _EXPRESSION_SWITCHEXPRESSION.nested_types_by_name['IfValue']
-_EXPRESSION_SINGULARORLIST = _EXPRESSION.nested_types_by_name['SingularOrList']
-_EXPRESSION_MULTIORLIST = _EXPRESSION.nested_types_by_name['MultiOrList']
-_EXPRESSION_MULTIORLIST_RECORD = _EXPRESSION_MULTIORLIST.nested_types_by_name['Record']
-_EXPRESSION_EMBEDDEDFUNCTION = _EXPRESSION.nested_types_by_name['EmbeddedFunction']
-_EXPRESSION_EMBEDDEDFUNCTION_PYTHONPICKLEFUNCTION = _EXPRESSION_EMBEDDEDFUNCTION.nested_types_by_name['PythonPickleFunction']
-_EXPRESSION_EMBEDDEDFUNCTION_WEBASSEMBLYFUNCTION = _EXPRESSION_EMBEDDEDFUNCTION.nested_types_by_name['WebAssemblyFunction']
-_EXPRESSION_REFERENCESEGMENT = _EXPRESSION.nested_types_by_name['ReferenceSegment']
-_EXPRESSION_REFERENCESEGMENT_MAPKEY = _EXPRESSION_REFERENCESEGMENT.nested_types_by_name['MapKey']
-_EXPRESSION_REFERENCESEGMENT_STRUCTFIELD = _EXPRESSION_REFERENCESEGMENT.nested_types_by_name['StructField']
-_EXPRESSION_REFERENCESEGMENT_LISTELEMENT = _EXPRESSION_REFERENCESEGMENT.nested_types_by_name['ListElement']
-_EXPRESSION_MASKEXPRESSION = _EXPRESSION.nested_types_by_name['MaskExpression']
-_EXPRESSION_MASKEXPRESSION_SELECT = _EXPRESSION_MASKEXPRESSION.nested_types_by_name['Select']
-_EXPRESSION_MASKEXPRESSION_STRUCTSELECT = _EXPRESSION_MASKEXPRESSION.nested_types_by_name['StructSelect']
-_EXPRESSION_MASKEXPRESSION_STRUCTITEM = _EXPRESSION_MASKEXPRESSION.nested_types_by_name['StructItem']
-_EXPRESSION_MASKEXPRESSION_LISTSELECT = _EXPRESSION_MASKEXPRESSION.nested_types_by_name['ListSelect']
-_EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM = _EXPRESSION_MASKEXPRESSION_LISTSELECT.nested_types_by_name['ListSelectItem']
-_EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM_LISTELEMENT = _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM.nested_types_by_name['ListElement']
-_EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM_LISTSLICE = _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM.nested_types_by_name['ListSlice']
-_EXPRESSION_MASKEXPRESSION_MAPSELECT = _EXPRESSION_MASKEXPRESSION.nested_types_by_name['MapSelect']
-_EXPRESSION_MASKEXPRESSION_MAPSELECT_MAPKEY = _EXPRESSION_MASKEXPRESSION_MAPSELECT.nested_types_by_name['MapKey']
-_EXPRESSION_MASKEXPRESSION_MAPSELECT_MAPKEYEXPRESSION = _EXPRESSION_MASKEXPRESSION_MAPSELECT.nested_types_by_name['MapKeyExpression']
-_EXPRESSION_FIELDREFERENCE = _EXPRESSION.nested_types_by_name['FieldReference']
-_EXPRESSION_FIELDREFERENCE_ROOTREFERENCE = _EXPRESSION_FIELDREFERENCE.nested_types_by_name['RootReference']
-_EXPRESSION_FIELDREFERENCE_OUTERREFERENCE = _EXPRESSION_FIELDREFERENCE.nested_types_by_name['OuterReference']
-_EXPRESSION_SUBQUERY = _EXPRESSION.nested_types_by_name['Subquery']
-_EXPRESSION_SUBQUERY_SCALAR = _EXPRESSION_SUBQUERY.nested_types_by_name['Scalar']
-_EXPRESSION_SUBQUERY_INPREDICATE = _EXPRESSION_SUBQUERY.nested_types_by_name['InPredicate']
-_EXPRESSION_SUBQUERY_SETPREDICATE = _EXPRESSION_SUBQUERY.nested_types_by_name['SetPredicate']
-_EXPRESSION_SUBQUERY_SETCOMPARISON = _EXPRESSION_SUBQUERY.nested_types_by_name['SetComparison']
-_SORTFIELD = DESCRIPTOR.message_types_by_name['SortField']
-_AGGREGATEFUNCTION = DESCRIPTOR.message_types_by_name['AggregateFunction']
-_JOINREL_JOINTYPE = _JOINREL.enum_types_by_name['JoinType']
-_SETREL_SETOP = _SETREL.enum_types_by_name['SetOp']
-_EXPRESSION_CAST_FAILUREBEHAVIOR = _EXPRESSION_CAST.enum_types_by_name['FailureBehavior']
-_EXPRESSION_SUBQUERY_SETPREDICATE_PREDICATEOP = _EXPRESSION_SUBQUERY_SETPREDICATE.enum_types_by_name['PredicateOp']
-_EXPRESSION_SUBQUERY_SETCOMPARISON_COMPARISONOP = _EXPRESSION_SUBQUERY_SETCOMPARISON.enum_types_by_name['ComparisonOp']
-_EXPRESSION_SUBQUERY_SETCOMPARISON_REDUCTIONOP = _EXPRESSION_SUBQUERY_SETCOMPARISON.enum_types_by_name['ReductionOp']
-_SORTFIELD_SORTDIRECTION = _SORTFIELD.enum_types_by_name['SortDirection']
-_AGGREGATEFUNCTION_AGGREGATIONINVOCATION = _AGGREGATEFUNCTION.enum_types_by_name['AggregationInvocation']
-RelCommon = _reflection.GeneratedProtocolMessageType('RelCommon', (_message.Message,), {'Direct': _reflection.GeneratedProtocolMessageType('Direct', (_message.Message,), {'DESCRIPTOR': _RELCOMMON_DIRECT, '__module__': 'substrait.algebra_pb2'}), 'Emit': _reflection.GeneratedProtocolMessageType('Emit', (_message.Message,), {'DESCRIPTOR': _RELCOMMON_EMIT, '__module__': 'substrait.algebra_pb2'}), 'Hint': _reflection.GeneratedProtocolMessageType('Hint', (_message.Message,), {'Stats': _reflection.GeneratedProtocolMessageType('Stats', (_message.Message,), {'DESCRIPTOR': _RELCOMMON_HINT_STATS, '__module__': 'substrait.algebra_pb2'}), 'RuntimeConstraint': _reflection.GeneratedProtocolMessageType('RuntimeConstraint', (_message.Message,), {'DESCRIPTOR': _RELCOMMON_HINT_RUNTIMECONSTRAINT, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _RELCOMMON_HINT, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _RELCOMMON, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(RelCommon)
-_sym_db.RegisterMessage(RelCommon.Direct)
-_sym_db.RegisterMessage(RelCommon.Emit)
-_sym_db.RegisterMessage(RelCommon.Hint)
-_sym_db.RegisterMessage(RelCommon.Hint.Stats)
-_sym_db.RegisterMessage(RelCommon.Hint.RuntimeConstraint)
-ReadRel = _reflection.GeneratedProtocolMessageType('ReadRel', (_message.Message,), {'NamedTable': _reflection.GeneratedProtocolMessageType('NamedTable', (_message.Message,), {'DESCRIPTOR': _READREL_NAMEDTABLE, '__module__': 'substrait.algebra_pb2'}), 'VirtualTable': _reflection.GeneratedProtocolMessageType('VirtualTable', (_message.Message,), {'DESCRIPTOR': _READREL_VIRTUALTABLE, '__module__': 'substrait.algebra_pb2'}), 'ExtensionTable': _reflection.GeneratedProtocolMessageType('ExtensionTable', (_message.Message,), {'DESCRIPTOR': _READREL_EXTENSIONTABLE, '__module__': 'substrait.algebra_pb2'}), 'LocalFiles': _reflection.GeneratedProtocolMessageType('LocalFiles', (_message.Message,), {'FileOrFiles': _reflection.GeneratedProtocolMessageType('FileOrFiles', (_message.Message,), {'ParquetReadOptions': _reflection.GeneratedProtocolMessageType('ParquetReadOptions', (_message.Message,), {'DESCRIPTOR': _READREL_LOCALFILES_FILEORFILES_PARQUETREADOPTIONS, '__module__': 'substrait.algebra_pb2'}), 'ArrowReadOptions': _reflection.GeneratedProtocolMessageType('ArrowReadOptions', (_message.Message,), {'DESCRIPTOR': _READREL_LOCALFILES_FILEORFILES_ARROWREADOPTIONS, '__module__': 'substrait.algebra_pb2'}), 'OrcReadOptions': _reflection.GeneratedProtocolMessageType('OrcReadOptions', (_message.Message,), {'DESCRIPTOR': _READREL_LOCALFILES_FILEORFILES_ORCREADOPTIONS, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _READREL_LOCALFILES_FILEORFILES, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _READREL_LOCALFILES, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _READREL, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(ReadRel)
-_sym_db.RegisterMessage(ReadRel.NamedTable)
-_sym_db.RegisterMessage(ReadRel.VirtualTable)
-_sym_db.RegisterMessage(ReadRel.ExtensionTable)
-_sym_db.RegisterMessage(ReadRel.LocalFiles)
-_sym_db.RegisterMessage(ReadRel.LocalFiles.FileOrFiles)
-_sym_db.RegisterMessage(ReadRel.LocalFiles.FileOrFiles.ParquetReadOptions)
-_sym_db.RegisterMessage(ReadRel.LocalFiles.FileOrFiles.ArrowReadOptions)
-_sym_db.RegisterMessage(ReadRel.LocalFiles.FileOrFiles.OrcReadOptions)
-ProjectRel = _reflection.GeneratedProtocolMessageType('ProjectRel', (_message.Message,), {'DESCRIPTOR': _PROJECTREL, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(ProjectRel)
-JoinRel = _reflection.GeneratedProtocolMessageType('JoinRel', (_message.Message,), {'DESCRIPTOR': _JOINREL, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(JoinRel)
-CrossRel = _reflection.GeneratedProtocolMessageType('CrossRel', (_message.Message,), {'DESCRIPTOR': _CROSSREL, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(CrossRel)
-FetchRel = _reflection.GeneratedProtocolMessageType('FetchRel', (_message.Message,), {'DESCRIPTOR': _FETCHREL, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(FetchRel)
-AggregateRel = _reflection.GeneratedProtocolMessageType('AggregateRel', (_message.Message,), {'Grouping': _reflection.GeneratedProtocolMessageType('Grouping', (_message.Message,), {'DESCRIPTOR': _AGGREGATEREL_GROUPING, '__module__': 'substrait.algebra_pb2'}), 'Measure': _reflection.GeneratedProtocolMessageType('Measure', (_message.Message,), {'DESCRIPTOR': _AGGREGATEREL_MEASURE, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _AGGREGATEREL, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(AggregateRel)
-_sym_db.RegisterMessage(AggregateRel.Grouping)
-_sym_db.RegisterMessage(AggregateRel.Measure)
-SortRel = _reflection.GeneratedProtocolMessageType('SortRel', (_message.Message,), {'DESCRIPTOR': _SORTREL, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(SortRel)
-FilterRel = _reflection.GeneratedProtocolMessageType('FilterRel', (_message.Message,), {'DESCRIPTOR': _FILTERREL, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(FilterRel)
-SetRel = _reflection.GeneratedProtocolMessageType('SetRel', (_message.Message,), {'DESCRIPTOR': _SETREL, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(SetRel)
-ExtensionSingleRel = _reflection.GeneratedProtocolMessageType('ExtensionSingleRel', (_message.Message,), {'DESCRIPTOR': _EXTENSIONSINGLEREL, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(ExtensionSingleRel)
-ExtensionLeafRel = _reflection.GeneratedProtocolMessageType('ExtensionLeafRel', (_message.Message,), {'DESCRIPTOR': _EXTENSIONLEAFREL, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(ExtensionLeafRel)
-ExtensionMultiRel = _reflection.GeneratedProtocolMessageType('ExtensionMultiRel', (_message.Message,), {'DESCRIPTOR': _EXTENSIONMULTIREL, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(ExtensionMultiRel)
-ExchangeRel = _reflection.GeneratedProtocolMessageType('ExchangeRel', (_message.Message,), {'ScatterFields': _reflection.GeneratedProtocolMessageType('ScatterFields', (_message.Message,), {'DESCRIPTOR': _EXCHANGEREL_SCATTERFIELDS, '__module__': 'substrait.algebra_pb2'}), 'SingleBucketExpression': _reflection.GeneratedProtocolMessageType('SingleBucketExpression', (_message.Message,), {'DESCRIPTOR': _EXCHANGEREL_SINGLEBUCKETEXPRESSION, '__module__': 'substrait.algebra_pb2'}), 'MultiBucketExpression': _reflection.GeneratedProtocolMessageType('MultiBucketExpression', (_message.Message,), {'DESCRIPTOR': _EXCHANGEREL_MULTIBUCKETEXPRESSION, '__module__': 'substrait.algebra_pb2'}), 'Broadcast': _reflection.GeneratedProtocolMessageType('Broadcast', (_message.Message,), {'DESCRIPTOR': _EXCHANGEREL_BROADCAST, '__module__': 'substrait.algebra_pb2'}), 'RoundRobin': _reflection.GeneratedProtocolMessageType('RoundRobin', (_message.Message,), {'DESCRIPTOR': _EXCHANGEREL_ROUNDROBIN, '__module__': 'substrait.algebra_pb2'}), 'ExchangeTarget': _reflection.GeneratedProtocolMessageType('ExchangeTarget', (_message.Message,), {'DESCRIPTOR': _EXCHANGEREL_EXCHANGETARGET, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXCHANGEREL, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(ExchangeRel)
-_sym_db.RegisterMessage(ExchangeRel.ScatterFields)
-_sym_db.RegisterMessage(ExchangeRel.SingleBucketExpression)
-_sym_db.RegisterMessage(ExchangeRel.MultiBucketExpression)
-_sym_db.RegisterMessage(ExchangeRel.Broadcast)
-_sym_db.RegisterMessage(ExchangeRel.RoundRobin)
-_sym_db.RegisterMessage(ExchangeRel.ExchangeTarget)
-RelRoot = _reflection.GeneratedProtocolMessageType('RelRoot', (_message.Message,), {'DESCRIPTOR': _RELROOT, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(RelRoot)
-Rel = _reflection.GeneratedProtocolMessageType('Rel', (_message.Message,), {'DESCRIPTOR': _REL, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(Rel)
-FunctionArgument = _reflection.GeneratedProtocolMessageType('FunctionArgument', (_message.Message,), {'Enum': _reflection.GeneratedProtocolMessageType('Enum', (_message.Message,), {'DESCRIPTOR': _FUNCTIONARGUMENT_ENUM, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _FUNCTIONARGUMENT, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(FunctionArgument)
-_sym_db.RegisterMessage(FunctionArgument.Enum)
-Expression = _reflection.GeneratedProtocolMessageType('Expression', (_message.Message,), {'Enum': _reflection.GeneratedProtocolMessageType('Enum', (_message.Message,), {'Empty': _reflection.GeneratedProtocolMessageType('Empty', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_ENUM_EMPTY, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXPRESSION_ENUM, '__module__': 'substrait.algebra_pb2'}), 'Literal': _reflection.GeneratedProtocolMessageType('Literal', (_message.Message,), {'VarChar': _reflection.GeneratedProtocolMessageType('VarChar', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_LITERAL_VARCHAR, '__module__': 'substrait.algebra_pb2'}), 'Decimal': _reflection.GeneratedProtocolMessageType('Decimal', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_LITERAL_DECIMAL, '__module__': 'substrait.algebra_pb2'}), 'Map': _reflection.GeneratedProtocolMessageType('Map', (_message.Message,), {'KeyValue': _reflection.GeneratedProtocolMessageType('KeyValue', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_LITERAL_MAP_KEYVALUE, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXPRESSION_LITERAL_MAP, '__module__': 'substrait.algebra_pb2'}), 'IntervalYearToMonth': _reflection.GeneratedProtocolMessageType('IntervalYearToMonth', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_LITERAL_INTERVALYEARTOMONTH, '__module__': 'substrait.algebra_pb2'}), 'IntervalDayToSecond': _reflection.GeneratedProtocolMessageType('IntervalDayToSecond', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_LITERAL_INTERVALDAYTOSECOND, '__module__': 'substrait.algebra_pb2'}), 'Struct': _reflection.GeneratedProtocolMessageType('Struct', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_LITERAL_STRUCT, '__module__': 'substrait.algebra_pb2'}), 'List': _reflection.GeneratedProtocolMessageType('List', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_LITERAL_LIST, '__module__': 'substrait.algebra_pb2'}), 'UserDefined': _reflection.GeneratedProtocolMessageType('UserDefined', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_LITERAL_USERDEFINED, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXPRESSION_LITERAL, '__module__': 'substrait.algebra_pb2'}), 'ScalarFunction': _reflection.GeneratedProtocolMessageType('ScalarFunction', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_SCALARFUNCTION, '__module__': 'substrait.algebra_pb2'}), 'WindowFunction': _reflection.GeneratedProtocolMessageType('WindowFunction', (_message.Message,), {'Bound': _reflection.GeneratedProtocolMessageType('Bound', (_message.Message,), {'Preceding': _reflection.GeneratedProtocolMessageType('Preceding', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_WINDOWFUNCTION_BOUND_PRECEDING, '__module__': 'substrait.algebra_pb2'}), 'Following': _reflection.GeneratedProtocolMessageType('Following', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_WINDOWFUNCTION_BOUND_FOLLOWING, '__module__': 'substrait.algebra_pb2'}), 'CurrentRow': _reflection.GeneratedProtocolMessageType('CurrentRow', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_WINDOWFUNCTION_BOUND_CURRENTROW, '__module__': 'substrait.algebra_pb2'}), 'Unbounded': _reflection.GeneratedProtocolMessageType('Unbounded', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_WINDOWFUNCTION_BOUND_UNBOUNDED, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXPRESSION_WINDOWFUNCTION_BOUND, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXPRESSION_WINDOWFUNCTION, '__module__': 'substrait.algebra_pb2'}), 'IfThen': _reflection.GeneratedProtocolMessageType('IfThen', (_message.Message,), {'IfClause': _reflection.GeneratedProtocolMessageType('IfClause', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_IFTHEN_IFCLAUSE, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXPRESSION_IFTHEN, '__module__': 'substrait.algebra_pb2'}), 'Cast': _reflection.GeneratedProtocolMessageType('Cast', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_CAST, '__module__': 'substrait.algebra_pb2'}), 'SwitchExpression': _reflection.GeneratedProtocolMessageType('SwitchExpression', (_message.Message,), {'IfValue': _reflection.GeneratedProtocolMessageType('IfValue', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_SWITCHEXPRESSION_IFVALUE, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXPRESSION_SWITCHEXPRESSION, '__module__': 'substrait.algebra_pb2'}), 'SingularOrList': _reflection.GeneratedProtocolMessageType('SingularOrList', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_SINGULARORLIST, '__module__': 'substrait.algebra_pb2'}), 'MultiOrList': _reflection.GeneratedProtocolMessageType('MultiOrList', (_message.Message,), {'Record': _reflection.GeneratedProtocolMessageType('Record', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_MULTIORLIST_RECORD, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXPRESSION_MULTIORLIST, '__module__': 'substrait.algebra_pb2'}), 'EmbeddedFunction': _reflection.GeneratedProtocolMessageType('EmbeddedFunction', (_message.Message,), {'PythonPickleFunction': _reflection.GeneratedProtocolMessageType('PythonPickleFunction', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_EMBEDDEDFUNCTION_PYTHONPICKLEFUNCTION, '__module__': 'substrait.algebra_pb2'}), 'WebAssemblyFunction': _reflection.GeneratedProtocolMessageType('WebAssemblyFunction', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_EMBEDDEDFUNCTION_WEBASSEMBLYFUNCTION, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXPRESSION_EMBEDDEDFUNCTION, '__module__': 'substrait.algebra_pb2'}), 'ReferenceSegment': _reflection.GeneratedProtocolMessageType('ReferenceSegment', (_message.Message,), {'MapKey': _reflection.GeneratedProtocolMessageType('MapKey', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_REFERENCESEGMENT_MAPKEY, '__module__': 'substrait.algebra_pb2'}), 'StructField': _reflection.GeneratedProtocolMessageType('StructField', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_REFERENCESEGMENT_STRUCTFIELD, '__module__': 'substrait.algebra_pb2'}), 'ListElement': _reflection.GeneratedProtocolMessageType('ListElement', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_REFERENCESEGMENT_LISTELEMENT, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXPRESSION_REFERENCESEGMENT, '__module__': 'substrait.algebra_pb2'}), 'MaskExpression': _reflection.GeneratedProtocolMessageType('MaskExpression', (_message.Message,), {'Select': _reflection.GeneratedProtocolMessageType('Select', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_MASKEXPRESSION_SELECT, '__module__': 'substrait.algebra_pb2'}), 'StructSelect': _reflection.GeneratedProtocolMessageType('StructSelect', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_MASKEXPRESSION_STRUCTSELECT, '__module__': 'substrait.algebra_pb2'}), 'StructItem': _reflection.GeneratedProtocolMessageType('StructItem', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_MASKEXPRESSION_STRUCTITEM, '__module__': 'substrait.algebra_pb2'}), 'ListSelect': _reflection.GeneratedProtocolMessageType('ListSelect', (_message.Message,), {'ListSelectItem': _reflection.GeneratedProtocolMessageType('ListSelectItem', (_message.Message,), {'ListElement': _reflection.GeneratedProtocolMessageType('ListElement', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM_LISTELEMENT, '__module__': 'substrait.algebra_pb2'}), 'ListSlice': _reflection.GeneratedProtocolMessageType('ListSlice', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM_LISTSLICE, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXPRESSION_MASKEXPRESSION_LISTSELECT, '__module__': 'substrait.algebra_pb2'}), 'MapSelect': _reflection.GeneratedProtocolMessageType('MapSelect', (_message.Message,), {'MapKey': _reflection.GeneratedProtocolMessageType('MapKey', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_MASKEXPRESSION_MAPSELECT_MAPKEY, '__module__': 'substrait.algebra_pb2'}), 'MapKeyExpression': _reflection.GeneratedProtocolMessageType('MapKeyExpression', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_MASKEXPRESSION_MAPSELECT_MAPKEYEXPRESSION, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXPRESSION_MASKEXPRESSION_MAPSELECT, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXPRESSION_MASKEXPRESSION, '__module__': 'substrait.algebra_pb2'}), 'FieldReference': _reflection.GeneratedProtocolMessageType('FieldReference', (_message.Message,), {'RootReference': _reflection.GeneratedProtocolMessageType('RootReference', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_FIELDREFERENCE_ROOTREFERENCE, '__module__': 'substrait.algebra_pb2'}), 'OuterReference': _reflection.GeneratedProtocolMessageType('OuterReference', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_FIELDREFERENCE_OUTERREFERENCE, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXPRESSION_FIELDREFERENCE, '__module__': 'substrait.algebra_pb2'}), 'Subquery': _reflection.GeneratedProtocolMessageType('Subquery', (_message.Message,), {'Scalar': _reflection.GeneratedProtocolMessageType('Scalar', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_SUBQUERY_SCALAR, '__module__': 'substrait.algebra_pb2'}), 'InPredicate': _reflection.GeneratedProtocolMessageType('InPredicate', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_SUBQUERY_INPREDICATE, '__module__': 'substrait.algebra_pb2'}), 'SetPredicate': _reflection.GeneratedProtocolMessageType('SetPredicate', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_SUBQUERY_SETPREDICATE, '__module__': 'substrait.algebra_pb2'}), 'SetComparison': _reflection.GeneratedProtocolMessageType('SetComparison', (_message.Message,), {'DESCRIPTOR': _EXPRESSION_SUBQUERY_SETCOMPARISON, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXPRESSION_SUBQUERY, '__module__': 'substrait.algebra_pb2'}), 'DESCRIPTOR': _EXPRESSION, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(Expression)
-_sym_db.RegisterMessage(Expression.Enum)
-_sym_db.RegisterMessage(Expression.Enum.Empty)
-_sym_db.RegisterMessage(Expression.Literal)
-_sym_db.RegisterMessage(Expression.Literal.VarChar)
-_sym_db.RegisterMessage(Expression.Literal.Decimal)
-_sym_db.RegisterMessage(Expression.Literal.Map)
-_sym_db.RegisterMessage(Expression.Literal.Map.KeyValue)
-_sym_db.RegisterMessage(Expression.Literal.IntervalYearToMonth)
-_sym_db.RegisterMessage(Expression.Literal.IntervalDayToSecond)
-_sym_db.RegisterMessage(Expression.Literal.Struct)
-_sym_db.RegisterMessage(Expression.Literal.List)
-_sym_db.RegisterMessage(Expression.Literal.UserDefined)
-_sym_db.RegisterMessage(Expression.ScalarFunction)
-_sym_db.RegisterMessage(Expression.WindowFunction)
-_sym_db.RegisterMessage(Expression.WindowFunction.Bound)
-_sym_db.RegisterMessage(Expression.WindowFunction.Bound.Preceding)
-_sym_db.RegisterMessage(Expression.WindowFunction.Bound.Following)
-_sym_db.RegisterMessage(Expression.WindowFunction.Bound.CurrentRow)
-_sym_db.RegisterMessage(Expression.WindowFunction.Bound.Unbounded)
-_sym_db.RegisterMessage(Expression.IfThen)
-_sym_db.RegisterMessage(Expression.IfThen.IfClause)
-_sym_db.RegisterMessage(Expression.Cast)
-_sym_db.RegisterMessage(Expression.SwitchExpression)
-_sym_db.RegisterMessage(Expression.SwitchExpression.IfValue)
-_sym_db.RegisterMessage(Expression.SingularOrList)
-_sym_db.RegisterMessage(Expression.MultiOrList)
-_sym_db.RegisterMessage(Expression.MultiOrList.Record)
-_sym_db.RegisterMessage(Expression.EmbeddedFunction)
-_sym_db.RegisterMessage(Expression.EmbeddedFunction.PythonPickleFunction)
-_sym_db.RegisterMessage(Expression.EmbeddedFunction.WebAssemblyFunction)
-_sym_db.RegisterMessage(Expression.ReferenceSegment)
-_sym_db.RegisterMessage(Expression.ReferenceSegment.MapKey)
-_sym_db.RegisterMessage(Expression.ReferenceSegment.StructField)
-_sym_db.RegisterMessage(Expression.ReferenceSegment.ListElement)
-_sym_db.RegisterMessage(Expression.MaskExpression)
-_sym_db.RegisterMessage(Expression.MaskExpression.Select)
-_sym_db.RegisterMessage(Expression.MaskExpression.StructSelect)
-_sym_db.RegisterMessage(Expression.MaskExpression.StructItem)
-_sym_db.RegisterMessage(Expression.MaskExpression.ListSelect)
-_sym_db.RegisterMessage(Expression.MaskExpression.ListSelect.ListSelectItem)
-_sym_db.RegisterMessage(Expression.MaskExpression.ListSelect.ListSelectItem.ListElement)
-_sym_db.RegisterMessage(Expression.MaskExpression.ListSelect.ListSelectItem.ListSlice)
-_sym_db.RegisterMessage(Expression.MaskExpression.MapSelect)
-_sym_db.RegisterMessage(Expression.MaskExpression.MapSelect.MapKey)
-_sym_db.RegisterMessage(Expression.MaskExpression.MapSelect.MapKeyExpression)
-_sym_db.RegisterMessage(Expression.FieldReference)
-_sym_db.RegisterMessage(Expression.FieldReference.RootReference)
-_sym_db.RegisterMessage(Expression.FieldReference.OuterReference)
-_sym_db.RegisterMessage(Expression.Subquery)
-_sym_db.RegisterMessage(Expression.Subquery.Scalar)
-_sym_db.RegisterMessage(Expression.Subquery.InPredicate)
-_sym_db.RegisterMessage(Expression.Subquery.SetPredicate)
-_sym_db.RegisterMessage(Expression.Subquery.SetComparison)
-SortField = _reflection.GeneratedProtocolMessageType('SortField', (_message.Message,), {'DESCRIPTOR': _SORTFIELD, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(SortField)
-AggregateFunction = _reflection.GeneratedProtocolMessageType('AggregateFunction', (_message.Message,), {'DESCRIPTOR': _AGGREGATEFUNCTION, '__module__': 'substrait.algebra_pb2'})
-_sym_db.RegisterMessage(AggregateFunction)
-if _descriptor._USE_C_DESCRIPTORS == False:
-    DESCRIPTOR._options = None
-    DESCRIPTOR._serialized_options = b'\n\x12io.substrait.protoP\x01Z*github.com/substrait-io/substrait-go/proto\xaa\x02\x12Substrait.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 = 18656
-    _AGGREGATIONPHASE._serialized_end = 18895
-    _RELCOMMON._serialized_start = 156
-    _RELCOMMON._serialized_end = 974
-    _RELCOMMON_DIRECT._serialized_start = 408
-    _RELCOMMON_DIRECT._serialized_end = 416
-    _RELCOMMON_EMIT._serialized_start = 418
-    _RELCOMMON_EMIT._serialized_end = 463
-    _RELCOMMON_HINT._serialized_start = 466
-    _RELCOMMON_HINT._serialized_end = 961
-    _RELCOMMON_HINT_STATS._serialized_start = 695
-    _RELCOMMON_HINT_STATS._serialized_end = 852
-    _RELCOMMON_HINT_RUNTIMECONSTRAINT._serialized_start = 854
-    _RELCOMMON_HINT_RUNTIMECONSTRAINT._serialized_end = 961
-    _READREL._serialized_start = 977
-    _READREL._serialized_end = 2663
-    _READREL_NAMEDTABLE._serialized_start = 1578
-    _READREL_NAMEDTABLE._serialized_end = 1700
-    _READREL_VIRTUALTABLE._serialized_start = 1702
-    _READREL_VIRTUALTABLE._serialized_end = 1778
-    _READREL_EXTENSIONTABLE._serialized_start = 1780
-    _READREL_EXTENSIONTABLE._serialized_end = 1842
-    _READREL_LOCALFILES._serialized_start = 1845
-    _READREL_LOCALFILES._serialized_end = 2650
-    _READREL_LOCALFILES_FILEORFILES._serialized_start = 2013
-    _READREL_LOCALFILES_FILEORFILES._serialized_end = 2650
-    _READREL_LOCALFILES_FILEORFILES_PARQUETREADOPTIONS._serialized_start = 2550
-    _READREL_LOCALFILES_FILEORFILES_PARQUETREADOPTIONS._serialized_end = 2570
-    _READREL_LOCALFILES_FILEORFILES_ARROWREADOPTIONS._serialized_start = 2572
-    _READREL_LOCALFILES_FILEORFILES_ARROWREADOPTIONS._serialized_end = 2590
-    _READREL_LOCALFILES_FILEORFILES_ORCREADOPTIONS._serialized_start = 2592
-    _READREL_LOCALFILES_FILEORFILES_ORCREADOPTIONS._serialized_end = 2608
-    _PROJECTREL._serialized_start = 2666
-    _PROJECTREL._serialized_end = 2907
-    _JOINREL._serialized_start = 2910
-    _JOINREL._serialized_end = 3481
-    _JOINREL_JOINTYPE._serialized_start = 3299
-    _JOINREL_JOINTYPE._serialized_end = 3481
-    _CROSSREL._serialized_start = 3484
-    _CROSSREL._serialized_end = 3702
-    _FETCHREL._serialized_start = 3705
-    _FETCHREL._serialized_end = 3933
-    _AGGREGATEREL._serialized_start = 3936
-    _AGGREGATEREL._serialized_end = 4447
-    _AGGREGATEREL_GROUPING._serialized_start = 4249
-    _AGGREGATEREL_GROUPING._serialized_end = 4333
-    _AGGREGATEREL_MEASURE._serialized_start = 4335
-    _AGGREGATEREL_MEASURE._serialized_end = 4447
-    _SORTREL._serialized_start = 4450
-    _SORTREL._serialized_end = 4675
-    _FILTERREL._serialized_start = 4678
-    _FILTERREL._serialized_end = 4914
-    _SETREL._serialized_start = 4917
-    _SETREL._serialized_end = 5343
-    _SETREL_SETOP._serialized_start = 5143
-    _SETREL_SETOP._serialized_end = 5343
-    _EXTENSIONSINGLEREL._serialized_start = 5346
-    _EXTENSIONSINGLEREL._serialized_end = 5496
-    _EXTENSIONLEAFREL._serialized_start = 5498
-    _EXTENSIONLEAFREL._serialized_end = 5608
-    _EXTENSIONMULTIREL._serialized_start = 5611
-    _EXTENSIONMULTIREL._serialized_end = 5762
-    _EXCHANGEREL._serialized_start = 5765
-    _EXCHANGEREL._serialized_end = 6943
-    _EXCHANGEREL_SCATTERFIELDS._serialized_start = 6447
-    _EXCHANGEREL_SCATTERFIELDS._serialized_end = 6524
-    _EXCHANGEREL_SINGLEBUCKETEXPRESSION._serialized_start = 6526
-    _EXCHANGEREL_SINGLEBUCKETEXPRESSION._serialized_end = 6605
-    _EXCHANGEREL_MULTIBUCKETEXPRESSION._serialized_start = 6608
-    _EXCHANGEREL_MULTIBUCKETEXPRESSION._serialized_end = 6736
-    _EXCHANGEREL_BROADCAST._serialized_start = 6738
-    _EXCHANGEREL_BROADCAST._serialized_end = 6749
-    _EXCHANGEREL_ROUNDROBIN._serialized_start = 6751
-    _EXCHANGEREL_ROUNDROBIN._serialized_end = 6785
-    _EXCHANGEREL_EXCHANGETARGET._serialized_start = 6788
-    _EXCHANGEREL_EXCHANGETARGET._serialized_end = 6926
-    _RELROOT._serialized_start = 6945
-    _RELROOT._serialized_end = 7014
-    _REL._serialized_start = 7017
-    _REL._serialized_end = 7664
-    _FUNCTIONARGUMENT._serialized_start = 7667
-    _FUNCTIONARGUMENT._serialized_end = 7952
-    _FUNCTIONARGUMENT_ENUM._serialized_start = 7829
-    _FUNCTIONARGUMENT_ENUM._serialized_end = 7940
-    _EXPRESSION._serialized_start = 7955
-    _EXPRESSION._serialized_end = 17682
-    _EXPRESSION_ENUM._serialized_start = 8726
-    _EXPRESSION_ENUM._serialized_end = 8864
-    _EXPRESSION_ENUM_EMPTY._serialized_start = 8836
-    _EXPRESSION_ENUM_EMPTY._serialized_end = 8847
-    _EXPRESSION_LITERAL._serialized_start = 8867
-    _EXPRESSION_LITERAL._serialized_end = 10943
-    _EXPRESSION_LITERAL_VARCHAR._serialized_start = 10121
-    _EXPRESSION_LITERAL_VARCHAR._serialized_end = 10176
-    _EXPRESSION_LITERAL_DECIMAL._serialized_start = 10178
-    _EXPRESSION_LITERAL_DECIMAL._serialized_end = 10261
-    _EXPRESSION_LITERAL_MAP._serialized_start = 10264
-    _EXPRESSION_LITERAL_MAP._serialized_end = 10458
-    _EXPRESSION_LITERAL_MAP_KEYVALUE._serialized_start = 10346
-    _EXPRESSION_LITERAL_MAP_KEYVALUE._serialized_end = 10458
-    _EXPRESSION_LITERAL_INTERVALYEARTOMONTH._serialized_start = 10460
-    _EXPRESSION_LITERAL_INTERVALYEARTOMONTH._serialized_end = 10527
-    _EXPRESSION_LITERAL_INTERVALDAYTOSECOND._serialized_start = 10529
-    _EXPRESSION_LITERAL_INTERVALDAYTOSECOND._serialized_end = 10632
-    _EXPRESSION_LITERAL_STRUCT._serialized_start = 10634
-    _EXPRESSION_LITERAL_STRUCT._serialized_end = 10697
-    _EXPRESSION_LITERAL_LIST._serialized_start = 10699
-    _EXPRESSION_LITERAL_LIST._serialized_end = 10760
-    _EXPRESSION_LITERAL_USERDEFINED._serialized_start = 10763
-    _EXPRESSION_LITERAL_USERDEFINED._serialized_end = 10927
-    _EXPRESSION_SCALARFUNCTION._serialized_start = 10946
-    _EXPRESSION_SCALARFUNCTION._serialized_end = 11165
-    _EXPRESSION_WINDOWFUNCTION._serialized_start = 11168
-    _EXPRESSION_WINDOWFUNCTION._serialized_end = 12158
-    _EXPRESSION_WINDOWFUNCTION_BOUND._serialized_start = 11694
-    _EXPRESSION_WINDOWFUNCTION_BOUND._serialized_end = 12158
-    _EXPRESSION_WINDOWFUNCTION_BOUND_PRECEDING._serialized_start = 12051
-    _EXPRESSION_WINDOWFUNCTION_BOUND_PRECEDING._serialized_end = 12086
-    _EXPRESSION_WINDOWFUNCTION_BOUND_FOLLOWING._serialized_start = 12088
-    _EXPRESSION_WINDOWFUNCTION_BOUND_FOLLOWING._serialized_end = 12123
-    _EXPRESSION_WINDOWFUNCTION_BOUND_CURRENTROW._serialized_start = 12125
-    _EXPRESSION_WINDOWFUNCTION_BOUND_CURRENTROW._serialized_end = 12137
-    _EXPRESSION_WINDOWFUNCTION_BOUND_UNBOUNDED._serialized_start = 12139
-    _EXPRESSION_WINDOWFUNCTION_BOUND_UNBOUNDED._serialized_end = 12150
-    _EXPRESSION_IFTHEN._serialized_start = 12161
-    _EXPRESSION_IFTHEN._serialized_end = 12363
-    _EXPRESSION_IFTHEN_IFCLAUSE._serialized_start = 12271
-    _EXPRESSION_IFTHEN_IFCLAUSE._serialized_end = 12363
-    _EXPRESSION_CAST._serialized_start = 12366
-    _EXPRESSION_CAST._serialized_end = 12666
-    _EXPRESSION_CAST_FAILUREBEHAVIOR._serialized_start = 12543
-    _EXPRESSION_CAST_FAILUREBEHAVIOR._serialized_end = 12666
-    _EXPRESSION_SWITCHEXPRESSION._serialized_start = 12669
-    _EXPRESSION_SWITCHEXPRESSION._serialized_end = 12942
-    _EXPRESSION_SWITCHEXPRESSION_IFVALUE._serialized_start = 12843
-    _EXPRESSION_SWITCHEXPRESSION_IFVALUE._serialized_end = 12942
-    _EXPRESSION_SINGULARORLIST._serialized_start = 12944
-    _EXPRESSION_SINGULARORLIST._serialized_end = 13054
-    _EXPRESSION_MULTIORLIST._serialized_start = 13057
-    _EXPRESSION_MULTIORLIST._serialized_end = 13240
-    _EXPRESSION_MULTIORLIST_RECORD._serialized_start = 13185
-    _EXPRESSION_MULTIORLIST_RECORD._serialized_end = 13240
-    _EXPRESSION_EMBEDDEDFUNCTION._serialized_start = 13243
-    _EXPRESSION_EMBEDDEDFUNCTION._serialized_end = 13774
-    _EXPRESSION_EMBEDDEDFUNCTION_PYTHONPICKLEFUNCTION._serialized_start = 13597
-    _EXPRESSION_EMBEDDEDFUNCTION_PYTHONPICKLEFUNCTION._serialized_end = 13683
-    _EXPRESSION_EMBEDDEDFUNCTION_WEBASSEMBLYFUNCTION._serialized_start = 13685
-    _EXPRESSION_EMBEDDEDFUNCTION_WEBASSEMBLYFUNCTION._serialized_end = 13766
-    _EXPRESSION_REFERENCESEGMENT._serialized_start = 13777
-    _EXPRESSION_REFERENCESEGMENT._serialized_end = 14393
-    _EXPRESSION_REFERENCESEGMENT_MAPKEY._serialized_start = 14049
-    _EXPRESSION_REFERENCESEGMENT_MAPKEY._serialized_end = 14175
-    _EXPRESSION_REFERENCESEGMENT_STRUCTFIELD._serialized_start = 14177
-    _EXPRESSION_REFERENCESEGMENT_STRUCTFIELD._serialized_end = 14274
-    _EXPRESSION_REFERENCESEGMENT_LISTELEMENT._serialized_start = 14276
-    _EXPRESSION_REFERENCESEGMENT_LISTELEMENT._serialized_end = 14375
-    _EXPRESSION_MASKEXPRESSION._serialized_start = 14396
-    _EXPRESSION_MASKEXPRESSION._serialized_end = 15838
-    _EXPRESSION_MASKEXPRESSION_SELECT._serialized_start = 14548
-    _EXPRESSION_MASKEXPRESSION_SELECT._serialized_end = 14780
-    _EXPRESSION_MASKEXPRESSION_STRUCTSELECT._serialized_start = 14782
-    _EXPRESSION_MASKEXPRESSION_STRUCTSELECT._serialized_end = 14880
-    _EXPRESSION_MASKEXPRESSION_STRUCTITEM._serialized_start = 14882
-    _EXPRESSION_MASKEXPRESSION_STRUCTITEM._serialized_end = 14983
-    _EXPRESSION_MASKEXPRESSION_LISTSELECT._serialized_start = 14986
-    _EXPRESSION_MASKEXPRESSION_LISTSELECT._serialized_end = 15472
-    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM._serialized_start = 15162
-    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM._serialized_end = 15472
-    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM_LISTELEMENT._serialized_start = 15376
-    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM_LISTELEMENT._serialized_end = 15411
-    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM_LISTSLICE._serialized_start = 15413
-    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM_LISTSLICE._serialized_end = 15464
-    _EXPRESSION_MASKEXPRESSION_MAPSELECT._serialized_start = 15475
-    _EXPRESSION_MASKEXPRESSION_MAPSELECT._serialized_end = 15838
-    _EXPRESSION_MASKEXPRESSION_MAPSELECT_MAPKEY._serialized_start = 15729
-    _EXPRESSION_MASKEXPRESSION_MAPSELECT_MAPKEY._serialized_end = 15762
-    _EXPRESSION_MASKEXPRESSION_MAPSELECT_MAPKEYEXPRESSION._serialized_start = 15764
-    _EXPRESSION_MASKEXPRESSION_MAPSELECT_MAPKEYEXPRESSION._serialized_end = 15828
-    _EXPRESSION_FIELDREFERENCE._serialized_start = 15841
-    _EXPRESSION_FIELDREFERENCE._serialized_end = 16366
-    _EXPRESSION_FIELDREFERENCE_ROOTREFERENCE._serialized_start = 16273
-    _EXPRESSION_FIELDREFERENCE_ROOTREFERENCE._serialized_end = 16288
-    _EXPRESSION_FIELDREFERENCE_OUTERREFERENCE._serialized_start = 16290
-    _EXPRESSION_FIELDREFERENCE_OUTERREFERENCE._serialized_end = 16335
-    _EXPRESSION_SUBQUERY._serialized_start = 16369
-    _EXPRESSION_SUBQUERY._serialized_end = 17670
-    _EXPRESSION_SUBQUERY_SCALAR._serialized_start = 16698
-    _EXPRESSION_SUBQUERY_SCALAR._serialized_end = 16744
-    _EXPRESSION_SUBQUERY_INPREDICATE._serialized_start = 16746
-    _EXPRESSION_SUBQUERY_INPREDICATE._serialized_end = 16852
-    _EXPRESSION_SUBQUERY_SETPREDICATE._serialized_start = 16855
-    _EXPRESSION_SUBQUERY_SETPREDICATE._serialized_end = 17096
-    _EXPRESSION_SUBQUERY_SETPREDICATE_PREDICATEOP._serialized_start = 17003
-    _EXPRESSION_SUBQUERY_SETPREDICATE_PREDICATEOP._serialized_end = 17096
-    _EXPRESSION_SUBQUERY_SETCOMPARISON._serialized_start = 17099
-    _EXPRESSION_SUBQUERY_SETCOMPARISON._serialized_end = 17653
-    _EXPRESSION_SUBQUERY_SETCOMPARISON_COMPARISONOP._serialized_start = 17387
-    _EXPRESSION_SUBQUERY_SETCOMPARISON_COMPARISONOP._serialized_end = 17564
-    _EXPRESSION_SUBQUERY_SETCOMPARISON_REDUCTIONOP._serialized_start = 17566
-    _EXPRESSION_SUBQUERY_SETCOMPARISON_REDUCTIONOP._serialized_end = 17653
-    _SORTFIELD._serialized_start = 17685
-    _SORTFIELD._serialized_end = 18114
-    _SORTFIELD_SORTDIRECTION._serialized_start = 17880
-    _SORTFIELD_SORTDIRECTION._serialized_end = 18101
-    _AGGREGATEFUNCTION._serialized_start = 18117
-    _AGGREGATEFUNCTION._serialized_end = 18653
-    _AGGREGATEFUNCTION_AGGREGATIONINVOCATION._serialized_start = 18521
-    _AGGREGATEFUNCTION_AGGREGATIONINVOCATION._serialized_end = 18653
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/capabilities_pb2.py b/ibis_substrait/proto/substrait/capabilities_pb2.py
deleted file mode 100644
index df629618..00000000
--- a/ibis_substrait/proto/substrait/capabilities_pb2.py
+++ /dev/null
@@ -1,20 +0,0 @@
-"""Generated protocol buffer code."""
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-from google.protobuf import symbol_database as _symbol_database
-_sym_db = _symbol_database.Default()
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1csubstrait/capabilities.proto\x12\tsubstrait"\xec\x02\n\x0cCapabilities\x12-\n\x12substrait_versions\x18\x01 \x03(\tR\x11substraitVersions\x12?\n\x1cadvanced_extension_type_urls\x18\x02 \x03(\tR\x19advancedExtensionTypeUrls\x12T\n\x11simple_extensions\x18\x03 \x03(\x0b2\'.substrait.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\x11typeVariationKeysBW\n\x12io.substrait.protoP\x01Z*github.com/substrait-io/substrait-go/proto\xaa\x02\x12Substrait.Protobufb\x06proto3')
-_CAPABILITIES = DESCRIPTOR.message_types_by_name['Capabilities']
-_CAPABILITIES_SIMPLEEXTENSION = _CAPABILITIES.nested_types_by_name['SimpleExtension']
-Capabilities = _reflection.GeneratedProtocolMessageType('Capabilities', (_message.Message,), {'SimpleExtension': _reflection.GeneratedProtocolMessageType('SimpleExtension', (_message.Message,), {'DESCRIPTOR': _CAPABILITIES_SIMPLEEXTENSION, '__module__': 'substrait.capabilities_pb2'}), 'DESCRIPTOR': _CAPABILITIES, '__module__': 'substrait.capabilities_pb2'})
-_sym_db.RegisterMessage(Capabilities)
-_sym_db.RegisterMessage(Capabilities.SimpleExtension)
-if _descriptor._USE_C_DESCRIPTORS == False:
-    DESCRIPTOR._options = None
-    DESCRIPTOR._serialized_options = b'\n\x12io.substrait.protoP\x01Z*github.com/substrait-io/substrait-go/proto\xaa\x02\x12Substrait.Protobuf'
-    _CAPABILITIES._serialized_start = 44
-    _CAPABILITIES._serialized_end = 408
-    _CAPABILITIES_SIMPLEEXTENSION._serialized_start = 259
-    _CAPABILITIES_SIMPLEEXTENSION._serialized_end = 408
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/extensions/extensions_pb2.py b/ibis_substrait/proto/substrait/extensions/extensions_pb2.py
deleted file mode 100644
index aaebb3f4..00000000
--- a/ibis_substrait/proto/substrait/extensions/extensions_pb2.py
+++ /dev/null
@@ -1,39 +0,0 @@
-"""Generated protocol buffer code."""
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-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/extensions/extensions.proto\x12\x14substrait.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"\xb4\x06\n\x1aSimpleExtensionDeclaration\x12g\n\x0eextension_type\x18\x01 \x01(\x0b2>.substrait.extensions.SimpleExtensionDeclaration.ExtensionTypeH\x00R\rextensionType\x12\x83\x01\n\x18extension_type_variation\x18\x02 \x01(\x0b2G.substrait.extensions.SimpleExtensionDeclaration.ExtensionTypeVariationH\x00R\x16extensionTypeVariation\x12s\n\x12extension_function\x18\x03 \x01(\x0b2B.substrait.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\x0benhancementBb\n\x12io.substrait.protoP\x01Z5github.com/substrait-io/substrait-go/proto/extensions\xaa\x02\x12Substrait.Protobufb\x06proto3')
-_SIMPLEEXTENSIONURI = DESCRIPTOR.message_types_by_name['SimpleExtensionURI']
-_SIMPLEEXTENSIONDECLARATION = DESCRIPTOR.message_types_by_name['SimpleExtensionDeclaration']
-_SIMPLEEXTENSIONDECLARATION_EXTENSIONTYPE = _SIMPLEEXTENSIONDECLARATION.nested_types_by_name['ExtensionType']
-_SIMPLEEXTENSIONDECLARATION_EXTENSIONTYPEVARIATION = _SIMPLEEXTENSIONDECLARATION.nested_types_by_name['ExtensionTypeVariation']
-_SIMPLEEXTENSIONDECLARATION_EXTENSIONFUNCTION = _SIMPLEEXTENSIONDECLARATION.nested_types_by_name['ExtensionFunction']
-_ADVANCEDEXTENSION = DESCRIPTOR.message_types_by_name['AdvancedExtension']
-SimpleExtensionURI = _reflection.GeneratedProtocolMessageType('SimpleExtensionURI', (_message.Message,), {'DESCRIPTOR': _SIMPLEEXTENSIONURI, '__module__': 'substrait.extensions.extensions_pb2'})
-_sym_db.RegisterMessage(SimpleExtensionURI)
-SimpleExtensionDeclaration = _reflection.GeneratedProtocolMessageType('SimpleExtensionDeclaration', (_message.Message,), {'ExtensionType': _reflection.GeneratedProtocolMessageType('ExtensionType', (_message.Message,), {'DESCRIPTOR': _SIMPLEEXTENSIONDECLARATION_EXTENSIONTYPE, '__module__': 'substrait.extensions.extensions_pb2'}), 'ExtensionTypeVariation': _reflection.GeneratedProtocolMessageType('ExtensionTypeVariation', (_message.Message,), {'DESCRIPTOR': _SIMPLEEXTENSIONDECLARATION_EXTENSIONTYPEVARIATION, '__module__': 'substrait.extensions.extensions_pb2'}), 'ExtensionFunction': _reflection.GeneratedProtocolMessageType('ExtensionFunction', (_message.Message,), {'DESCRIPTOR': _SIMPLEEXTENSIONDECLARATION_EXTENSIONFUNCTION, '__module__': 'substrait.extensions.extensions_pb2'}), 'DESCRIPTOR': _SIMPLEEXTENSIONDECLARATION, '__module__': 'substrait.extensions.extensions_pb2'})
-_sym_db.RegisterMessage(SimpleExtensionDeclaration)
-_sym_db.RegisterMessage(SimpleExtensionDeclaration.ExtensionType)
-_sym_db.RegisterMessage(SimpleExtensionDeclaration.ExtensionTypeVariation)
-_sym_db.RegisterMessage(SimpleExtensionDeclaration.ExtensionFunction)
-AdvancedExtension = _reflection.GeneratedProtocolMessageType('AdvancedExtension', (_message.Message,), {'DESCRIPTOR': _ADVANCEDEXTENSION, '__module__': 'substrait.extensions.extensions_pb2'})
-_sym_db.RegisterMessage(AdvancedExtension)
-if _descriptor._USE_C_DESCRIPTORS == False:
-    DESCRIPTOR._options = None
-    DESCRIPTOR._serialized_options = b'\n\x12io.substrait.protoP\x01Z5github.com/substrait-io/substrait-go/proto/extensions\xaa\x02\x12Substrait.Protobuf'
-    _SIMPLEEXTENSIONURI._serialized_start = 90
-    _SIMPLEEXTENSIONURI._serialized_end = 178
-    _SIMPLEEXTENSIONDECLARATION._serialized_start = 181
-    _SIMPLEEXTENSIONDECLARATION._serialized_end = 1001
-    _SIMPLEEXTENSIONDECLARATION_EXTENSIONTYPE._serialized_start = 567
-    _SIMPLEEXTENSIONDECLARATION_EXTENSIONTYPE._serialized_end = 691
-    _SIMPLEEXTENSIONDECLARATION_EXTENSIONTYPEVARIATION._serialized_start = 694
-    _SIMPLEEXTENSIONDECLARATION_EXTENSIONTYPEVARIATION._serialized_end = 846
-    _SIMPLEEXTENSIONDECLARATION_EXTENSIONFUNCTION._serialized_start = 849
-    _SIMPLEEXTENSIONDECLARATION_EXTENSIONFUNCTION._serialized_end = 985
-    _ADVANCEDEXTENSION._serialized_start = 1004
-    _ADVANCEDEXTENSION._serialized_end = 1137
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/function_pb2.py b/ibis_substrait/proto/substrait/function_pb2.py
deleted file mode 100644
index 6175d835..00000000
--- a/ibis_substrait/proto/substrait/function_pb2.py
+++ /dev/null
@@ -1,72 +0,0 @@
-"""Generated protocol buffer code."""
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-from google.protobuf import symbol_database as _symbol_database
-_sym_db = _symbol_database.Default()
-from ..substrait import parameterized_types_pb2 as substrait_dot_parameterized__types__pb2
-from ..substrait import type_pb2 as substrait_dot_type__pb2
-from ..substrait import type_expressions_pb2 as substrait_dot_type__expressions__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18substrait/function.proto\x12\tsubstrait\x1a#substrait/parameterized_types.proto\x1a\x14substrait/type.proto\x1a substrait/type_expressions.proto"\xd9\x19\n\x11FunctionSignature\x1a\xbc\x02\n\x10FinalArgVariadic\x12\x19\n\x08min_args\x18\x01 \x01(\x03R\x07minArgs\x12\x19\n\x08max_args\x18\x02 \x01(\x03R\x07maxArgs\x12d\n\x0bconsistency\x18\x03 \x01(\x0e2B.substrait.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\xc8\x04\n\x06Scalar\x12C\n\targuments\x18\x02 \x03(\x0b2%.substrait.FunctionSignature.ArgumentR\targuments\x12\x12\n\x04name\x18\x03 \x03(\tR\x04name\x12J\n\x0bdescription\x18\x04 \x01(\x0b2(.substrait.FunctionSignature.DescriptionR\x0bdescription\x12$\n\rdeterministic\x18\x07 \x01(\x08R\rdeterministic\x12+\n\x11session_dependent\x18\x08 \x01(\x08R\x10sessionDependent\x12@\n\x0boutput_type\x18\t \x01(\x0b2\x1f.substrait.DerivationExpressionR\noutputType\x12K\n\x08variadic\x18\n \x01(\x0b2-.substrait.FunctionSignature.FinalArgVariadicH\x00R\x08variadic\x12E\n\x06normal\x18\x0b \x01(\x0b2+.substrait.FunctionSignature.FinalArgNormalH\x00R\x06normal\x12U\n\x0fimplementations\x18\x0c \x03(\x0b2+.substrait.FunctionSignature.ImplementationR\x0fimplementationsB\x19\n\x17final_variable_behavior\x1a\xbc\x05\n\tAggregate\x12C\n\targuments\x18\x02 \x03(\x0b2%.substrait.FunctionSignature.ArgumentR\targuments\x12\x12\n\x04name\x18\x03 \x01(\tR\x04name\x12J\n\x0bdescription\x18\x04 \x01(\x0b2(.substrait.FunctionSignature.DescriptionR\x0bdescription\x12$\n\rdeterministic\x18\x07 \x01(\x08R\rdeterministic\x12+\n\x11session_dependent\x18\x08 \x01(\x08R\x10sessionDependent\x12@\n\x0boutput_type\x18\t \x01(\x0b2\x1f.substrait.DerivationExpressionR\noutputType\x12K\n\x08variadic\x18\n \x01(\x0b2-.substrait.FunctionSignature.FinalArgVariadicH\x00R\x08variadic\x12E\n\x06normal\x18\x0b \x01(\x0b2+.substrait.FunctionSignature.FinalArgNormalH\x00R\x06normal\x12\x18\n\x07ordered\x18\x0e \x01(\x08R\x07ordered\x12\x17\n\x07max_set\x18\x0c \x01(\x04R\x06maxSet\x12<\n\x11intermediate_type\x18\r \x01(\x0b2\x0f.substrait.TypeR\x10intermediateType\x12U\n\x0fimplementations\x18\x0f \x03(\x0b2+.substrait.FunctionSignature.ImplementationR\x0fimplementationsB\x19\n\x17final_variable_behavior\x1a\xfb\x06\n\x06Window\x12C\n\targuments\x18\x02 \x03(\x0b2%.substrait.FunctionSignature.ArgumentR\targuments\x12\x12\n\x04name\x18\x03 \x03(\tR\x04name\x12J\n\x0bdescription\x18\x04 \x01(\x0b2(.substrait.FunctionSignature.DescriptionR\x0bdescription\x12$\n\rdeterministic\x18\x07 \x01(\x08R\rdeterministic\x12+\n\x11session_dependent\x18\x08 \x01(\x08R\x10sessionDependent\x12L\n\x11intermediate_type\x18\t \x01(\x0b2\x1f.substrait.DerivationExpressionR\x10intermediateType\x12@\n\x0boutput_type\x18\n \x01(\x0b2\x1f.substrait.DerivationExpressionR\noutputType\x12K\n\x08variadic\x18\x10 \x01(\x0b2-.substrait.FunctionSignature.FinalArgVariadicH\x00R\x08variadic\x12E\n\x06normal\x18\x11 \x01(\x0b2+.substrait.FunctionSignature.FinalArgNormalH\x00R\x06normal\x12\x18\n\x07ordered\x18\x0b \x01(\x08R\x07ordered\x12\x17\n\x07max_set\x18\x0c \x01(\x04R\x06maxSet\x12O\n\x0bwindow_type\x18\x0e \x01(\x0e2..substrait.FunctionSignature.Window.WindowTypeR\nwindowType\x12U\n\x0fimplementations\x18\x0f \x03(\x0b2+.substrait.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\xb1\x01\n\x0eImplementation\x12D\n\x04type\x18\x01 \x01(\x0e20.substrait.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\xf7\x03\n\x08Argument\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12K\n\x05value\x18\x02 \x01(\x0b23.substrait.FunctionSignature.Argument.ValueArgumentH\x00R\x05value\x12H\n\x04type\x18\x03 \x01(\x0b22.substrait.FunctionSignature.Argument.TypeArgumentH\x00R\x04type\x12H\n\x04enum\x18\x04 \x01(\x0b22.substrait.FunctionSignature.Argument.EnumArgumentH\x00R\x04enum\x1a]\n\rValueArgument\x120\n\x04type\x18\x01 \x01(\x0b2\x1c.substrait.ParameterizedTypeR\x04type\x12\x1a\n\x08constant\x18\x02 \x01(\x08R\x08constant\x1a@\n\x0cTypeArgument\x120\n\x04type\x18\x01 \x01(\x0b2\x1c.substrait.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_kindBW\n\x12io.substrait.protoP\x01Z*github.com/substrait-io/substrait-go/proto\xaa\x02\x12Substrait.Protobufb\x06proto3')
-_FUNCTIONSIGNATURE = DESCRIPTOR.message_types_by_name['FunctionSignature']
-_FUNCTIONSIGNATURE_FINALARGVARIADIC = _FUNCTIONSIGNATURE.nested_types_by_name['FinalArgVariadic']
-_FUNCTIONSIGNATURE_FINALARGNORMAL = _FUNCTIONSIGNATURE.nested_types_by_name['FinalArgNormal']
-_FUNCTIONSIGNATURE_SCALAR = _FUNCTIONSIGNATURE.nested_types_by_name['Scalar']
-_FUNCTIONSIGNATURE_AGGREGATE = _FUNCTIONSIGNATURE.nested_types_by_name['Aggregate']
-_FUNCTIONSIGNATURE_WINDOW = _FUNCTIONSIGNATURE.nested_types_by_name['Window']
-_FUNCTIONSIGNATURE_DESCRIPTION = _FUNCTIONSIGNATURE.nested_types_by_name['Description']
-_FUNCTIONSIGNATURE_IMPLEMENTATION = _FUNCTIONSIGNATURE.nested_types_by_name['Implementation']
-_FUNCTIONSIGNATURE_ARGUMENT = _FUNCTIONSIGNATURE.nested_types_by_name['Argument']
-_FUNCTIONSIGNATURE_ARGUMENT_VALUEARGUMENT = _FUNCTIONSIGNATURE_ARGUMENT.nested_types_by_name['ValueArgument']
-_FUNCTIONSIGNATURE_ARGUMENT_TYPEARGUMENT = _FUNCTIONSIGNATURE_ARGUMENT.nested_types_by_name['TypeArgument']
-_FUNCTIONSIGNATURE_ARGUMENT_ENUMARGUMENT = _FUNCTIONSIGNATURE_ARGUMENT.nested_types_by_name['EnumArgument']
-_FUNCTIONSIGNATURE_FINALARGVARIADIC_PARAMETERCONSISTENCY = _FUNCTIONSIGNATURE_FINALARGVARIADIC.enum_types_by_name['ParameterConsistency']
-_FUNCTIONSIGNATURE_WINDOW_WINDOWTYPE = _FUNCTIONSIGNATURE_WINDOW.enum_types_by_name['WindowType']
-_FUNCTIONSIGNATURE_IMPLEMENTATION_TYPE = _FUNCTIONSIGNATURE_IMPLEMENTATION.enum_types_by_name['Type']
-FunctionSignature = _reflection.GeneratedProtocolMessageType('FunctionSignature', (_message.Message,), {'FinalArgVariadic': _reflection.GeneratedProtocolMessageType('FinalArgVariadic', (_message.Message,), {'DESCRIPTOR': _FUNCTIONSIGNATURE_FINALARGVARIADIC, '__module__': 'substrait.function_pb2'}), 'FinalArgNormal': _reflection.GeneratedProtocolMessageType('FinalArgNormal', (_message.Message,), {'DESCRIPTOR': _FUNCTIONSIGNATURE_FINALARGNORMAL, '__module__': 'substrait.function_pb2'}), 'Scalar': _reflection.GeneratedProtocolMessageType('Scalar', (_message.Message,), {'DESCRIPTOR': _FUNCTIONSIGNATURE_SCALAR, '__module__': 'substrait.function_pb2'}), 'Aggregate': _reflection.GeneratedProtocolMessageType('Aggregate', (_message.Message,), {'DESCRIPTOR': _FUNCTIONSIGNATURE_AGGREGATE, '__module__': 'substrait.function_pb2'}), 'Window': _reflection.GeneratedProtocolMessageType('Window', (_message.Message,), {'DESCRIPTOR': _FUNCTIONSIGNATURE_WINDOW, '__module__': 'substrait.function_pb2'}), 'Description': _reflection.GeneratedProtocolMessageType('Description', (_message.Message,), {'DESCRIPTOR': _FUNCTIONSIGNATURE_DESCRIPTION, '__module__': 'substrait.function_pb2'}), 'Implementation': _reflection.GeneratedProtocolMessageType('Implementation', (_message.Message,), {'DESCRIPTOR': _FUNCTIONSIGNATURE_IMPLEMENTATION, '__module__': 'substrait.function_pb2'}), 'Argument': _reflection.GeneratedProtocolMessageType('Argument', (_message.Message,), {'ValueArgument': _reflection.GeneratedProtocolMessageType('ValueArgument', (_message.Message,), {'DESCRIPTOR': _FUNCTIONSIGNATURE_ARGUMENT_VALUEARGUMENT, '__module__': 'substrait.function_pb2'}), 'TypeArgument': _reflection.GeneratedProtocolMessageType('TypeArgument', (_message.Message,), {'DESCRIPTOR': _FUNCTIONSIGNATURE_ARGUMENT_TYPEARGUMENT, '__module__': 'substrait.function_pb2'}), 'EnumArgument': _reflection.GeneratedProtocolMessageType('EnumArgument', (_message.Message,), {'DESCRIPTOR': _FUNCTIONSIGNATURE_ARGUMENT_ENUMARGUMENT, '__module__': 'substrait.function_pb2'}), 'DESCRIPTOR': _FUNCTIONSIGNATURE_ARGUMENT, '__module__': 'substrait.function_pb2'}), 'DESCRIPTOR': _FUNCTIONSIGNATURE, '__module__': 'substrait.function_pb2'})
-_sym_db.RegisterMessage(FunctionSignature)
-_sym_db.RegisterMessage(FunctionSignature.FinalArgVariadic)
-_sym_db.RegisterMessage(FunctionSignature.FinalArgNormal)
-_sym_db.RegisterMessage(FunctionSignature.Scalar)
-_sym_db.RegisterMessage(FunctionSignature.Aggregate)
-_sym_db.RegisterMessage(FunctionSignature.Window)
-_sym_db.RegisterMessage(FunctionSignature.Description)
-_sym_db.RegisterMessage(FunctionSignature.Implementation)
-_sym_db.RegisterMessage(FunctionSignature.Argument)
-_sym_db.RegisterMessage(FunctionSignature.Argument.ValueArgument)
-_sym_db.RegisterMessage(FunctionSignature.Argument.TypeArgument)
-_sym_db.RegisterMessage(FunctionSignature.Argument.EnumArgument)
-if _descriptor._USE_C_DESCRIPTORS == False:
-    DESCRIPTOR._options = None
-    DESCRIPTOR._serialized_options = b'\n\x12io.substrait.protoP\x01Z*github.com/substrait-io/substrait-go/proto\xaa\x02\x12Substrait.Protobuf'
-    _FUNCTIONSIGNATURE._serialized_start = 133
-    _FUNCTIONSIGNATURE._serialized_end = 3422
-    _FUNCTIONSIGNATURE_FINALARGVARIADIC._serialized_start = 155
-    _FUNCTIONSIGNATURE_FINALARGVARIADIC._serialized_end = 471
-    _FUNCTIONSIGNATURE_FINALARGVARIADIC_PARAMETERCONSISTENCY._serialized_start = 332
-    _FUNCTIONSIGNATURE_FINALARGVARIADIC_PARAMETERCONSISTENCY._serialized_end = 471
-    _FUNCTIONSIGNATURE_FINALARGNORMAL._serialized_start = 473
-    _FUNCTIONSIGNATURE_FINALARGNORMAL._serialized_end = 489
-    _FUNCTIONSIGNATURE_SCALAR._serialized_start = 492
-    _FUNCTIONSIGNATURE_SCALAR._serialized_end = 1076
-    _FUNCTIONSIGNATURE_AGGREGATE._serialized_start = 1079
-    _FUNCTIONSIGNATURE_AGGREGATE._serialized_end = 1779
-    _FUNCTIONSIGNATURE_WINDOW._serialized_start = 1782
-    _FUNCTIONSIGNATURE_WINDOW._serialized_end = 2673
-    _FUNCTIONSIGNATURE_WINDOW_WINDOWTYPE._serialized_start = 2551
-    _FUNCTIONSIGNATURE_WINDOW_WINDOWTYPE._serialized_end = 2646
-    _FUNCTIONSIGNATURE_DESCRIPTION._serialized_start = 2675
-    _FUNCTIONSIGNATURE_DESCRIPTION._serialized_end = 2736
-    _FUNCTIONSIGNATURE_IMPLEMENTATION._serialized_start = 2739
-    _FUNCTIONSIGNATURE_IMPLEMENTATION._serialized_end = 2916
-    _FUNCTIONSIGNATURE_IMPLEMENTATION_TYPE._serialized_start = 2845
-    _FUNCTIONSIGNATURE_IMPLEMENTATION_TYPE._serialized_end = 2916
-    _FUNCTIONSIGNATURE_ARGUMENT._serialized_start = 2919
-    _FUNCTIONSIGNATURE_ARGUMENT._serialized_end = 3422
-    _FUNCTIONSIGNATURE_ARGUMENT_VALUEARGUMENT._serialized_start = 3176
-    _FUNCTIONSIGNATURE_ARGUMENT_VALUEARGUMENT._serialized_end = 3269
-    _FUNCTIONSIGNATURE_ARGUMENT_TYPEARGUMENT._serialized_start = 3271
-    _FUNCTIONSIGNATURE_ARGUMENT_TYPEARGUMENT._serialized_end = 3335
-    _FUNCTIONSIGNATURE_ARGUMENT_ENUMARGUMENT._serialized_start = 3337
-    _FUNCTIONSIGNATURE_ARGUMENT_ENUMARGUMENT._serialized_end = 3405
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/extensions/__init__.py b/ibis_substrait/proto/substrait/ibis/__init__.py
similarity index 100%
rename from ibis_substrait/proto/substrait/extensions/__init__.py
rename to ibis_substrait/proto/substrait/ibis/__init__.py
diff --git a/ibis_substrait/proto/substrait/ibis/__init__.pyi b/ibis_substrait/proto/substrait/ibis/__init__.pyi
new file mode 100644
index 00000000..b96c56f6
--- /dev/null
+++ b/ibis_substrait/proto/substrait/ibis/__init__.pyi
@@ -0,0 +1,8 @@
+from . import extensions
+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
new file mode 100644
index 00000000..c3b75c9d
--- /dev/null
+++ b/ibis_substrait/proto/substrait/ibis/algebra_pb2.py
@@ -0,0 +1,236 @@
+"""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 google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__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\x1bgoogle/protobuf/empty.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"\xe6\r\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\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\xbe\x06\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\x8c\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\x1a\x14\n\x12ParquetReadOptions\x1a\x12\n\x10ArrowReadOptions\x1a\x10\n\x0eOrcReadOptionsB\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"\xc3\x05\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\x05crossB\n\n\x08rel_type"\xac\x02\n\x10FunctionArgument\x12;\n\x04enum\x18\x01 \x01(\x0b2%.substrait.ibis.FunctionArgument.EnumH\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\x05value\x1ao\n\x04Enum\x12\x1e\n\tspecified\x18\x01 \x01(\tH\x00R\tspecified\x12:\n\x0bunspecified\x18\x02 \x01(\x0b2\x16.google.protobuf.EmptyH\x00R\x0bunspecifiedB\x0b\n\tenum_kindB\n\n\x08arg_type"\x83P\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\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\xea\x01\n\x0eScalarFunction\x12-\n\x12function_reference\x18\x01 \x01(\rR\x11functionReference\x12>\n\targuments\x18\x04 \x03(\x0b2 .substrait.ibis.FunctionArgumentR\targuments\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\x9a\x08\n\x0eWindowFunction\x12-\n\x12function_reference\x18\x01 \x01(\rR\x11functionReference\x12:\n\npartitions\x18\x02 \x03(\x0b2\x1a.substrait.ibis.ExpressionR\npartitions\x12/\n\x05sorts\x18\x03 \x03(\x0b2\x19.substrait.ibis.SortFieldR\x05sorts\x12P\n\x0bupper_bound\x18\x04 \x01(\x0b2/.substrait.ibis.Expression.WindowFunction.BoundR\nupperBound\x12P\n\x0blower_bound\x18\x05 \x01(\x0b2/.substrait.ibis.Expression.WindowFunction.BoundR\nlowerBound\x126\n\x05phase\x18\x06 \x01(\x0e2 .substrait.ibis.AggregationPhaseR\x05phase\x125\n\x0boutput_type\x18\x07 \x01(\x0b2\x14.substrait.ibis.TypeR\noutputType\x12>\n\targuments\x18\t \x03(\x0b2 .substrait.ibis.FunctionArgumentR\targuments\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"\xb6\x04\n\x11AggregateFunction\x12-\n\x12function_reference\x18\x01 \x01(\rR\x11functionReference\x12>\n\targuments\x18\x07 \x03(\x0b2 .substrait.ibis.FunctionArgumentR\targuments\x12/\n\x05sorts\x18\x03 \x03(\x0b2\x19.substrait.ibis.SortFieldR\x05sorts\x126\n\x05phase\x18\x04 \x01(\x0e2 .substrait.ibis.AggregationPhaseR\x05phase\x125\n\x0boutput_type\x18\x05 \x01(\x0b2\x14.substrait.ibis.TypeR\noutputType\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"\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 = 19712
+    _AGGREGATIONPHASE._serialized_end = 19951
+    _RELCOMMON._serialized_start = 176
+    _RELCOMMON._serialized_end = 1039
+    _RELCOMMON_DIRECT._serialized_start = 448
+    _RELCOMMON_DIRECT._serialized_end = 456
+    _RELCOMMON_EMIT._serialized_start = 458
+    _RELCOMMON_EMIT._serialized_end = 503
+    _RELCOMMON_HINT._serialized_start = 506
+    _RELCOMMON_HINT._serialized_end = 1026
+    _RELCOMMON_HINT_STATS._serialized_start = 750
+    _RELCOMMON_HINT_STATS._serialized_end = 912
+    _RELCOMMON_HINT_RUNTIMECONSTRAINT._serialized_start = 914
+    _RELCOMMON_HINT_RUNTIMECONSTRAINT._serialized_end = 1026
+    _READREL._serialized_start = 1042
+    _READREL._serialized_end = 2808
+    _READREL_NAMEDTABLE._serialized_start = 1688
+    _READREL_NAMEDTABLE._serialized_end = 1815
+    _READREL_VIRTUALTABLE._serialized_start = 1817
+    _READREL_VIRTUALTABLE._serialized_end = 1898
+    _READREL_EXTENSIONTABLE._serialized_start = 1900
+    _READREL_EXTENSIONTABLE._serialized_end = 1962
+    _READREL_LOCALFILES._serialized_start = 1965
+    _READREL_LOCALFILES._serialized_end = 2795
+    _READREL_LOCALFILES_FILEORFILES._serialized_start = 2143
+    _READREL_LOCALFILES_FILEORFILES._serialized_end = 2795
+    _READREL_LOCALFILES_FILEORFILES_PARQUETREADOPTIONS._serialized_start = 2695
+    _READREL_LOCALFILES_FILEORFILES_PARQUETREADOPTIONS._serialized_end = 2715
+    _READREL_LOCALFILES_FILEORFILES_ARROWREADOPTIONS._serialized_start = 2717
+    _READREL_LOCALFILES_FILEORFILES_ARROWREADOPTIONS._serialized_end = 2735
+    _READREL_LOCALFILES_FILEORFILES_ORCREADOPTIONS._serialized_start = 2737
+    _READREL_LOCALFILES_FILEORFILES_ORCREADOPTIONS._serialized_end = 2753
+    _PROJECTREL._serialized_start = 2811
+    _PROJECTREL._serialized_end = 3072
+    _JOINREL._serialized_start = 3075
+    _JOINREL._serialized_end = 3681
+    _JOINREL_JOINTYPE._serialized_start = 3499
+    _JOINREL_JOINTYPE._serialized_end = 3681
+    _CROSSREL._serialized_start = 3684
+    _CROSSREL._serialized_end = 3922
+    _FETCHREL._serialized_start = 3925
+    _FETCHREL._serialized_end = 4168
+    _AGGREGATEREL._serialized_start = 4171
+    _AGGREGATEREL._serialized_end = 4722
+    _AGGREGATEREL_GROUPING._serialized_start = 4509
+    _AGGREGATEREL_GROUPING._serialized_end = 4598
+    _AGGREGATEREL_MEASURE._serialized_start = 4600
+    _AGGREGATEREL_MEASURE._serialized_end = 4722
+    _SORTREL._serialized_start = 4725
+    _SORTREL._serialized_end = 4970
+    _FILTERREL._serialized_start = 4973
+    _FILTERREL._serialized_end = 5229
+    _SETREL._serialized_start = 5232
+    _SETREL._serialized_end = 5678
+    _SETREL_SETOP._serialized_start = 5478
+    _SETREL_SETOP._serialized_end = 5678
+    _EXTENSIONSINGLEREL._serialized_start = 5681
+    _EXTENSIONSINGLEREL._serialized_end = 5841
+    _EXTENSIONLEAFREL._serialized_start = 5843
+    _EXTENSIONLEAFREL._serialized_end = 5958
+    _EXTENSIONMULTIREL._serialized_start = 5961
+    _EXTENSIONMULTIREL._serialized_end = 6122
+    _EXCHANGEREL._serialized_start = 6125
+    _EXCHANGEREL._serialized_end = 7363
+    _EXCHANGEREL_SCATTERFIELDS._serialized_start = 6852
+    _EXCHANGEREL_SCATTERFIELDS._serialized_end = 6934
+    _EXCHANGEREL_SINGLEBUCKETEXPRESSION._serialized_start = 6936
+    _EXCHANGEREL_SINGLEBUCKETEXPRESSION._serialized_end = 7020
+    _EXCHANGEREL_MULTIBUCKETEXPRESSION._serialized_start = 7023
+    _EXCHANGEREL_MULTIBUCKETEXPRESSION._serialized_end = 7156
+    _EXCHANGEREL_BROADCAST._serialized_start = 7158
+    _EXCHANGEREL_BROADCAST._serialized_end = 7169
+    _EXCHANGEREL_ROUNDROBIN._serialized_start = 7171
+    _EXCHANGEREL_ROUNDROBIN._serialized_end = 7205
+    _EXCHANGEREL_EXCHANGETARGET._serialized_start = 7208
+    _EXCHANGEREL_EXCHANGETARGET._serialized_end = 7346
+    _RELROOT._serialized_start = 7365
+    _RELROOT._serialized_end = 7439
+    _REL._serialized_start = 7442
+    _REL._serialized_end = 8149
+    _FUNCTIONARGUMENT._serialized_start = 8152
+    _FUNCTIONARGUMENT._serialized_end = 8452
+    _FUNCTIONARGUMENT_ENUM._serialized_start = 8329
+    _FUNCTIONARGUMENT_ENUM._serialized_end = 8440
+    _EXPRESSION._serialized_start = 8455
+    _EXPRESSION._serialized_end = 18698
+    _EXPRESSION_ENUM._serialized_start = 9281
+    _EXPRESSION_ENUM._serialized_end = 9424
+    _EXPRESSION_ENUM_EMPTY._serialized_start = 9396
+    _EXPRESSION_ENUM_EMPTY._serialized_end = 9407
+    _EXPRESSION_LITERAL._serialized_start = 9427
+    _EXPRESSION_LITERAL._serialized_end = 11588
+    _EXPRESSION_LITERAL_VARCHAR._serialized_start = 10736
+    _EXPRESSION_LITERAL_VARCHAR._serialized_end = 10791
+    _EXPRESSION_LITERAL_DECIMAL._serialized_start = 10793
+    _EXPRESSION_LITERAL_DECIMAL._serialized_end = 10876
+    _EXPRESSION_LITERAL_MAP._serialized_start = 10879
+    _EXPRESSION_LITERAL_MAP._serialized_end = 11088
+    _EXPRESSION_LITERAL_MAP_KEYVALUE._serialized_start = 10966
+    _EXPRESSION_LITERAL_MAP_KEYVALUE._serialized_end = 11088
+    _EXPRESSION_LITERAL_INTERVALYEARTOMONTH._serialized_start = 11090
+    _EXPRESSION_LITERAL_INTERVALYEARTOMONTH._serialized_end = 11157
+    _EXPRESSION_LITERAL_INTERVALDAYTOSECOND._serialized_start = 11159
+    _EXPRESSION_LITERAL_INTERVALDAYTOSECOND._serialized_end = 11262
+    _EXPRESSION_LITERAL_STRUCT._serialized_start = 11264
+    _EXPRESSION_LITERAL_STRUCT._serialized_end = 11332
+    _EXPRESSION_LITERAL_LIST._serialized_start = 11334
+    _EXPRESSION_LITERAL_LIST._serialized_end = 11400
+    _EXPRESSION_LITERAL_USERDEFINED._serialized_start = 11403
+    _EXPRESSION_LITERAL_USERDEFINED._serialized_end = 11572
+    _EXPRESSION_SCALARFUNCTION._serialized_start = 11591
+    _EXPRESSION_SCALARFUNCTION._serialized_end = 11825
+    _EXPRESSION_WINDOWFUNCTION._serialized_start = 11828
+    _EXPRESSION_WINDOWFUNCTION._serialized_end = 12878
+    _EXPRESSION_WINDOWFUNCTION_BOUND._serialized_start = 12394
+    _EXPRESSION_WINDOWFUNCTION_BOUND._serialized_end = 12878
+    _EXPRESSION_WINDOWFUNCTION_BOUND_PRECEDING._serialized_start = 12771
+    _EXPRESSION_WINDOWFUNCTION_BOUND_PRECEDING._serialized_end = 12806
+    _EXPRESSION_WINDOWFUNCTION_BOUND_FOLLOWING._serialized_start = 12808
+    _EXPRESSION_WINDOWFUNCTION_BOUND_FOLLOWING._serialized_end = 12843
+    _EXPRESSION_WINDOWFUNCTION_BOUND_CURRENTROW._serialized_start = 12845
+    _EXPRESSION_WINDOWFUNCTION_BOUND_CURRENTROW._serialized_end = 12857
+    _EXPRESSION_WINDOWFUNCTION_BOUND_UNBOUNDED._serialized_start = 12859
+    _EXPRESSION_WINDOWFUNCTION_BOUND_UNBOUNDED._serialized_end = 12870
+    _EXPRESSION_IFTHEN._serialized_start = 12881
+    _EXPRESSION_IFTHEN._serialized_end = 13103
+    _EXPRESSION_IFTHEN_IFCLAUSE._serialized_start = 13001
+    _EXPRESSION_IFTHEN_IFCLAUSE._serialized_end = 13103
+    _EXPRESSION_CAST._serialized_start = 13106
+    _EXPRESSION_CAST._serialized_end = 13421
+    _EXPRESSION_CAST_FAILUREBEHAVIOR._serialized_start = 13298
+    _EXPRESSION_CAST_FAILUREBEHAVIOR._serialized_end = 13421
+    _EXPRESSION_SWITCHEXPRESSION._serialized_start = 13424
+    _EXPRESSION_SWITCHEXPRESSION._serialized_end = 13722
+    _EXPRESSION_SWITCHEXPRESSION_IFVALUE._serialized_start = 13613
+    _EXPRESSION_SWITCHEXPRESSION_IFVALUE._serialized_end = 13722
+    _EXPRESSION_SINGULARORLIST._serialized_start = 13724
+    _EXPRESSION_SINGULARORLIST._serialized_end = 13844
+    _EXPRESSION_MULTIORLIST._serialized_start = 13847
+    _EXPRESSION_MULTIORLIST._serialized_end = 14045
+    _EXPRESSION_MULTIORLIST_RECORD._serialized_start = 13985
+    _EXPRESSION_MULTIORLIST_RECORD._serialized_end = 14045
+    _EXPRESSION_EMBEDDEDFUNCTION._serialized_start = 14048
+    _EXPRESSION_EMBEDDEDFUNCTION._serialized_end = 14599
+    _EXPRESSION_EMBEDDEDFUNCTION_PYTHONPICKLEFUNCTION._serialized_start = 14422
+    _EXPRESSION_EMBEDDEDFUNCTION_PYTHONPICKLEFUNCTION._serialized_end = 14508
+    _EXPRESSION_EMBEDDEDFUNCTION_WEBASSEMBLYFUNCTION._serialized_start = 14510
+    _EXPRESSION_EMBEDDEDFUNCTION_WEBASSEMBLYFUNCTION._serialized_end = 14591
+    _EXPRESSION_REFERENCESEGMENT._serialized_start = 14602
+    _EXPRESSION_REFERENCESEGMENT._serialized_end = 15254
+    _EXPRESSION_REFERENCESEGMENT_MAPKEY._serialized_start = 14890
+    _EXPRESSION_REFERENCESEGMENT_MAPKEY._serialized_end = 15026
+    _EXPRESSION_REFERENCESEGMENT_STRUCTFIELD._serialized_start = 15028
+    _EXPRESSION_REFERENCESEGMENT_STRUCTFIELD._serialized_end = 15130
+    _EXPRESSION_REFERENCESEGMENT_LISTELEMENT._serialized_start = 15132
+    _EXPRESSION_REFERENCESEGMENT_LISTELEMENT._serialized_end = 15236
+    _EXPRESSION_MASKEXPRESSION._serialized_start = 15257
+    _EXPRESSION_MASKEXPRESSION._serialized_end = 16764
+    _EXPRESSION_MASKEXPRESSION_SELECT._serialized_start = 15414
+    _EXPRESSION_MASKEXPRESSION_SELECT._serialized_end = 15661
+    _EXPRESSION_MASKEXPRESSION_STRUCTSELECT._serialized_start = 15663
+    _EXPRESSION_MASKEXPRESSION_STRUCTSELECT._serialized_end = 15766
+    _EXPRESSION_MASKEXPRESSION_STRUCTITEM._serialized_start = 15768
+    _EXPRESSION_MASKEXPRESSION_STRUCTITEM._serialized_end = 15874
+    _EXPRESSION_MASKEXPRESSION_LISTSELECT._serialized_start = 15877
+    _EXPRESSION_MASKEXPRESSION_LISTSELECT._serialized_end = 16383
+    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM._serialized_start = 16063
+    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM._serialized_end = 16383
+    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM_LISTELEMENT._serialized_start = 16287
+    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM_LISTELEMENT._serialized_end = 16322
+    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM_LISTSLICE._serialized_start = 16324
+    _EXPRESSION_MASKEXPRESSION_LISTSELECT_LISTSELECTITEM_LISTSLICE._serialized_end = 16375
+    _EXPRESSION_MASKEXPRESSION_MAPSELECT._serialized_start = 16386
+    _EXPRESSION_MASKEXPRESSION_MAPSELECT._serialized_end = 16764
+    _EXPRESSION_MASKEXPRESSION_MAPSELECT_MAPKEY._serialized_start = 16655
+    _EXPRESSION_MASKEXPRESSION_MAPSELECT_MAPKEY._serialized_end = 16688
+    _EXPRESSION_MASKEXPRESSION_MAPSELECT_MAPKEYEXPRESSION._serialized_start = 16690
+    _EXPRESSION_MASKEXPRESSION_MAPSELECT_MAPKEYEXPRESSION._serialized_end = 16754
+    _EXPRESSION_FIELDREFERENCE._serialized_start = 16767
+    _EXPRESSION_FIELDREFERENCE._serialized_end = 17317
+    _EXPRESSION_FIELDREFERENCE_ROOTREFERENCE._serialized_start = 17224
+    _EXPRESSION_FIELDREFERENCE_ROOTREFERENCE._serialized_end = 17239
+    _EXPRESSION_FIELDREFERENCE_OUTERREFERENCE._serialized_start = 17241
+    _EXPRESSION_FIELDREFERENCE_OUTERREFERENCE._serialized_end = 17286
+    _EXPRESSION_SUBQUERY._serialized_start = 17320
+    _EXPRESSION_SUBQUERY._serialized_end = 18686
+    _EXPRESSION_SUBQUERY_SCALAR._serialized_start = 17669
+    _EXPRESSION_SUBQUERY_SCALAR._serialized_end = 17720
+    _EXPRESSION_SUBQUERY_INPREDICATE._serialized_start = 17722
+    _EXPRESSION_SUBQUERY_INPREDICATE._serialized_end = 17838
+    _EXPRESSION_SUBQUERY_SETPREDICATE._serialized_start = 17841
+    _EXPRESSION_SUBQUERY_SETPREDICATE._serialized_end = 18092
+    _EXPRESSION_SUBQUERY_SETPREDICATE_PREDICATEOP._serialized_start = 17999
+    _EXPRESSION_SUBQUERY_SETPREDICATE_PREDICATEOP._serialized_end = 18092
+    _EXPRESSION_SUBQUERY_SETCOMPARISON._serialized_start = 18095
+    _EXPRESSION_SUBQUERY_SETCOMPARISON._serialized_end = 18669
+    _EXPRESSION_SUBQUERY_SETCOMPARISON_COMPARISONOP._serialized_start = 18403
+    _EXPRESSION_SUBQUERY_SETCOMPARISON_COMPARISONOP._serialized_end = 18580
+    _EXPRESSION_SUBQUERY_SETCOMPARISON_REDUCTIONOP._serialized_start = 18582
+    _EXPRESSION_SUBQUERY_SETCOMPARISON_REDUCTIONOP._serialized_end = 18669
+    _SORTFIELD._serialized_start = 18701
+    _SORTFIELD._serialized_end = 19140
+    _SORTFIELD_SORTDIRECTION._serialized_start = 18906
+    _SORTFIELD_SORTDIRECTION._serialized_end = 19127
+    _AGGREGATEFUNCTION._serialized_start = 19143
+    _AGGREGATEFUNCTION._serialized_end = 19709
+    _AGGREGATEFUNCTION_AGGREGATIONINVOCATION._serialized_start = 19577
+    _AGGREGATEFUNCTION_AGGREGATIONINVOCATION._serialized_end = 19709
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/algebra_pb2.pyi b/ibis_substrait/proto/substrait/ibis/algebra_pb2.pyi
similarity index 95%
rename from ibis_substrait/proto/substrait/algebra_pb2.pyi
rename to ibis_substrait/proto/substrait/ibis/algebra_pb2.pyi
index c950c812..a42c27f3 100644
--- a/ibis_substrait/proto/substrait/algebra_pb2.pyi
+++ b/ibis_substrait/proto/substrait/ibis/algebra_pb2.pyi
@@ -9,7 +9,7 @@ import google.protobuf.empty_pb2
 import google.protobuf.internal.containers
 import google.protobuf.internal.enum_type_wrapper
 import google.protobuf.message
-from .. import substrait
+from ... import substrait
 import typing
 import typing_extensions
 DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@@ -77,10 +77,10 @@ class RelCommon(google.protobuf.message.Message):
             record_size: builtins.float
 
             @property
-            def advanced_extension(self) -> substrait.extensions.extensions_pb2.AdvancedExtension:
+            def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
                 ...
 
-            def __init__(self, *, row_count: builtins.float=..., record_size: builtins.float=..., advanced_extension: typing.Optional[substrait.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
+            def __init__(self, *, row_count: builtins.float=..., record_size: builtins.float=..., advanced_extension: typing.Optional[substrait.ibis.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
                 ...
 
             def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension']) -> builtins.bool:
@@ -95,10 +95,10 @@ class RelCommon(google.protobuf.message.Message):
             ADVANCED_EXTENSION_FIELD_NUMBER: builtins.int
 
             @property
-            def advanced_extension(self) -> substrait.extensions.extensions_pb2.AdvancedExtension:
+            def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
                 ...
 
-            def __init__(self, *, advanced_extension: typing.Optional[substrait.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
+            def __init__(self, *, advanced_extension: typing.Optional[substrait.ibis.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
                 ...
 
             def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension']) -> builtins.bool:
@@ -119,10 +119,10 @@ class RelCommon(google.protobuf.message.Message):
             ...
 
         @property
-        def advanced_extension(self) -> substrait.extensions.extensions_pb2.AdvancedExtension:
+        def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
             ...
 
-        def __init__(self, *, stats: typing.Optional[global___RelCommon.Hint.Stats]=..., constraint: typing.Optional[global___RelCommon.Hint.RuntimeConstraint]=..., advanced_extension: typing.Optional[substrait.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
+        def __init__(self, *, stats: typing.Optional[global___RelCommon.Hint.Stats]=..., constraint: typing.Optional[global___RelCommon.Hint.RuntimeConstraint]=..., advanced_extension: typing.Optional[substrait.ibis.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
             ...
 
         def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'constraint', b'constraint', 'stats', b'stats']) -> builtins.bool:
@@ -150,10 +150,10 @@ class RelCommon(google.protobuf.message.Message):
         ...
 
     @property
-    def advanced_extension(self) -> substrait.extensions.extensions_pb2.AdvancedExtension:
+    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
         ...
 
-    def __init__(self, *, direct: typing.Optional[global___RelCommon.Direct]=..., emit: typing.Optional[global___RelCommon.Emit]=..., hint: typing.Optional[global___RelCommon.Hint]=..., advanced_extension: typing.Optional[substrait.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
+    def __init__(self, *, direct: typing.Optional[global___RelCommon.Direct]=..., emit: typing.Optional[global___RelCommon.Emit]=..., hint: typing.Optional[global___RelCommon.Hint]=..., advanced_extension: typing.Optional[substrait.ibis.extensions.extensions_pb2.AdvancedExtension]=...) -> 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:
@@ -183,10 +183,10 @@ class ReadRel(google.protobuf.message.Message):
             ...
 
         @property
-        def advanced_extension(self) -> substrait.extensions.extensions_pb2.AdvancedExtension:
+        def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
             ...
 
-        def __init__(self, *, names: typing.Optional[typing.Iterable[typing.Text]]=..., advanced_extension: typing.Optional[substrait.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
+        def __init__(self, *, names: typing.Optional[typing.Iterable[typing.Text]]=..., advanced_extension: typing.Optional[substrait.ibis.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
             ...
 
         def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension']) -> builtins.bool:
@@ -326,10 +326,10 @@ class ReadRel(google.protobuf.message.Message):
             ...
 
         @property
-        def advanced_extension(self) -> substrait.extensions.extensions_pb2.AdvancedExtension:
+        def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
             ...
 
-        def __init__(self, *, items: typing.Optional[typing.Iterable[global___ReadRel.LocalFiles.FileOrFiles]]=..., advanced_extension: typing.Optional[substrait.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
+        def __init__(self, *, items: typing.Optional[typing.Iterable[global___ReadRel.LocalFiles.FileOrFiles]]=..., advanced_extension: typing.Optional[substrait.ibis.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
             ...
 
         def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension']) -> builtins.bool:
@@ -352,7 +352,7 @@ class ReadRel(google.protobuf.message.Message):
         ...
 
     @property
-    def base_schema(self) -> substrait.type_pb2.NamedStruct:
+    def base_schema(self) -> substrait.ibis.type_pb2.NamedStruct:
         ...
 
     @property
@@ -364,7 +364,7 @@ class ReadRel(google.protobuf.message.Message):
         ...
 
     @property
-    def advanced_extension(self) -> substrait.extensions.extensions_pb2.AdvancedExtension:
+    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
         ...
 
     @property
@@ -383,7 +383,7 @@ class ReadRel(google.protobuf.message.Message):
     def extension_table(self) -> global___ReadRel.ExtensionTable:
         ...
 
-    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., base_schema: typing.Optional[substrait.type_pb2.NamedStruct]=..., filter: typing.Optional[global___Expression]=..., projection: typing.Optional[global___Expression.MaskExpression]=..., advanced_extension: typing.Optional[substrait.extensions.extensions_pb2.AdvancedExtension]=..., virtual_table: typing.Optional[global___ReadRel.VirtualTable]=..., local_files: typing.Optional[global___ReadRel.LocalFiles]=..., named_table: typing.Optional[global___ReadRel.NamedTable]=..., extension_table: typing.Optional[global___ReadRel.ExtensionTable]=...) -> None:
+    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., base_schema: typing.Optional[substrait.ibis.type_pb2.NamedStruct]=..., filter: typing.Optional[global___Expression]=..., projection: typing.Optional[global___Expression.MaskExpression]=..., advanced_extension: typing.Optional[substrait.ibis.extensions.extensions_pb2.AdvancedExtension]=..., virtual_table: typing.Optional[global___ReadRel.VirtualTable]=..., local_files: typing.Optional[global___ReadRel.LocalFiles]=..., named_table: typing.Optional[global___ReadRel.NamedTable]=..., extension_table: typing.Optional[global___ReadRel.ExtensionTable]=...) -> None:
         ...
 
     def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'base_schema', b'base_schema', '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:
@@ -417,10 +417,10 @@ class ProjectRel(google.protobuf.message.Message):
         ...
 
     @property
-    def advanced_extension(self) -> substrait.extensions.extensions_pb2.AdvancedExtension:
+    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
         ...
 
-    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., input: typing.Optional[global___Rel]=..., expressions: typing.Optional[typing.Iterable[global___Expression]]=..., advanced_extension: typing.Optional[substrait.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
+    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., input: typing.Optional[global___Rel]=..., expressions: typing.Optional[typing.Iterable[global___Expression]]=..., advanced_extension: typing.Optional[substrait.ibis.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
         ...
 
     def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'input', b'input']) -> builtins.bool:
@@ -491,10 +491,10 @@ class JoinRel(google.protobuf.message.Message):
     type: global___JoinRel.JoinType.ValueType
 
     @property
-    def advanced_extension(self) -> substrait.extensions.extensions_pb2.AdvancedExtension:
+    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
         ...
 
-    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., left: typing.Optional[global___Rel]=..., right: typing.Optional[global___Rel]=..., expression: typing.Optional[global___Expression]=..., post_join_filter: typing.Optional[global___Expression]=..., type: global___JoinRel.JoinType.ValueType=..., advanced_extension: typing.Optional[substrait.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
+    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., left: typing.Optional[global___Rel]=..., right: typing.Optional[global___Rel]=..., expression: typing.Optional[global___Expression]=..., post_join_filter: typing.Optional[global___Expression]=..., type: global___JoinRel.JoinType.ValueType=..., advanced_extension: typing.Optional[substrait.ibis.extensions.extensions_pb2.AdvancedExtension]=...) -> 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:
@@ -525,10 +525,10 @@ class CrossRel(google.protobuf.message.Message):
         ...
 
     @property
-    def advanced_extension(self) -> substrait.extensions.extensions_pb2.AdvancedExtension:
+    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
         ...
 
-    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., left: typing.Optional[global___Rel]=..., right: typing.Optional[global___Rel]=..., advanced_extension: typing.Optional[substrait.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
+    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., left: typing.Optional[global___Rel]=..., right: typing.Optional[global___Rel]=..., advanced_extension: typing.Optional[substrait.ibis.extensions.extensions_pb2.AdvancedExtension]=...) -> 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:
@@ -560,10 +560,10 @@ class FetchRel(google.protobuf.message.Message):
     'the amount of records to return'
 
     @property
-    def advanced_extension(self) -> substrait.extensions.extensions_pb2.AdvancedExtension:
+    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
         ...
 
-    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., input: typing.Optional[global___Rel]=..., offset: builtins.int=..., count: builtins.int=..., advanced_extension: typing.Optional[substrait.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
+    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., input: typing.Optional[global___Rel]=..., offset: builtins.int=..., count: builtins.int=..., advanced_extension: typing.Optional[substrait.ibis.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
         ...
 
     def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'input', b'input']) -> builtins.bool:
@@ -643,10 +643,10 @@ class AggregateRel(google.protobuf.message.Message):
         pass
 
     @property
-    def advanced_extension(self) -> substrait.extensions.extensions_pb2.AdvancedExtension:
+    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
         ...
 
-    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., input: typing.Optional[global___Rel]=..., groupings: typing.Optional[typing.Iterable[global___AggregateRel.Grouping]]=..., measures: typing.Optional[typing.Iterable[global___AggregateRel.Measure]]=..., advanced_extension: typing.Optional[substrait.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
+    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., input: typing.Optional[global___Rel]=..., groupings: typing.Optional[typing.Iterable[global___AggregateRel.Grouping]]=..., measures: typing.Optional[typing.Iterable[global___AggregateRel.Measure]]=..., advanced_extension: typing.Optional[substrait.ibis.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
         ...
 
     def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'input', b'input']) -> builtins.bool:
@@ -677,10 +677,10 @@ class SortRel(google.protobuf.message.Message):
         ...
 
     @property
-    def advanced_extension(self) -> substrait.extensions.extensions_pb2.AdvancedExtension:
+    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
         ...
 
-    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., input: typing.Optional[global___Rel]=..., sorts: typing.Optional[typing.Iterable[global___SortField]]=..., advanced_extension: typing.Optional[substrait.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
+    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., input: typing.Optional[global___Rel]=..., sorts: typing.Optional[typing.Iterable[global___SortField]]=..., advanced_extension: typing.Optional[substrait.ibis.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
         ...
 
     def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common', 'input', b'input']) -> builtins.bool:
@@ -711,10 +711,10 @@ class FilterRel(google.protobuf.message.Message):
         ...
 
     @property
-    def advanced_extension(self) -> substrait.extensions.extensions_pb2.AdvancedExtension:
+    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
         ...
 
-    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., input: typing.Optional[global___Rel]=..., condition: typing.Optional[global___Expression]=..., advanced_extension: typing.Optional[substrait.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
+    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., input: typing.Optional[global___Rel]=..., condition: typing.Optional[global___Expression]=..., advanced_extension: typing.Optional[substrait.ibis.extensions.extensions_pb2.AdvancedExtension]=...) -> 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:
@@ -766,10 +766,10 @@ class SetRel(google.protobuf.message.Message):
     op: global___SetRel.SetOp.ValueType
 
     @property
-    def advanced_extension(self) -> substrait.extensions.extensions_pb2.AdvancedExtension:
+    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
         ...
 
-    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., inputs: typing.Optional[typing.Iterable[global___Rel]]=..., op: global___SetRel.SetOp.ValueType=..., advanced_extension: typing.Optional[substrait.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
+    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., inputs: typing.Optional[typing.Iterable[global___Rel]]=..., op: global___SetRel.SetOp.ValueType=..., advanced_extension: typing.Optional[substrait.ibis.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
         ...
 
     def HasField(self, field_name: typing_extensions.Literal['advanced_extension', b'advanced_extension', 'common', b'common']) -> builtins.bool:
@@ -1012,10 +1012,10 @@ class ExchangeRel(google.protobuf.message.Message):
         ...
 
     @property
-    def advanced_extension(self) -> substrait.extensions.extensions_pb2.AdvancedExtension:
+    def advanced_extension(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
         ...
 
-    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., input: typing.Optional[global___Rel]=..., partition_count: builtins.int=..., targets: typing.Optional[typing.Iterable[global___ExchangeRel.ExchangeTarget]]=..., scatter_by_fields: typing.Optional[global___ExchangeRel.ScatterFields]=..., single_target: typing.Optional[global___ExchangeRel.SingleBucketExpression]=..., multi_target: typing.Optional[global___ExchangeRel.MultiBucketExpression]=..., round_robin: typing.Optional[global___ExchangeRel.RoundRobin]=..., broadcast: typing.Optional[global___ExchangeRel.Broadcast]=..., advanced_extension: typing.Optional[substrait.extensions.extensions_pb2.AdvancedExtension]=...) -> None:
+    def __init__(self, *, common: typing.Optional[global___RelCommon]=..., input: typing.Optional[global___Rel]=..., partition_count: builtins.int=..., targets: typing.Optional[typing.Iterable[global___ExchangeRel.ExchangeTarget]]=..., scatter_by_fields: typing.Optional[global___ExchangeRel.ScatterFields]=..., single_target: typing.Optional[global___ExchangeRel.SingleBucketExpression]=..., multi_target: typing.Optional[global___ExchangeRel.MultiBucketExpression]=..., round_robin: typing.Optional[global___ExchangeRel.RoundRobin]=..., broadcast: typing.Optional[global___ExchangeRel.Broadcast]=..., advanced_extension: typing.Optional[substrait.ibis.extensions.extensions_pb2.AdvancedExtension]=...) -> 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:
@@ -1168,14 +1168,14 @@ class FunctionArgument(google.protobuf.message.Message):
         ...
 
     @property
-    def type(self) -> substrait.type_pb2.Type:
+    def type(self) -> substrait.ibis.type_pb2.Type:
         ...
 
     @property
     def value(self) -> global___Expression:
         ...
 
-    def __init__(self, *, enum: typing.Optional[global___FunctionArgument.Enum]=..., type: typing.Optional[substrait.type_pb2.Type]=..., value: typing.Optional[global___Expression]=...) -> None:
+    def __init__(self, *, enum: typing.Optional[global___FunctionArgument.Enum]=..., type: typing.Optional[substrait.ibis.type_pb2.Type]=..., value: typing.Optional[global___Expression]=...) -> 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:
@@ -1356,7 +1356,7 @@ class Expression(google.protobuf.message.Message):
             'points to a type_anchor defined in this plan'
 
             @property
-            def type_parameters(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[substrait.type_pb2.Type.Parameter]:
+            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.
                 """
@@ -1369,7 +1369,7 @@ class Expression(google.protobuf.message.Message):
                 """
                 pass
 
-            def __init__(self, *, type_reference: builtins.int=..., type_parameters: typing.Optional[typing.Iterable[substrait.type_pb2.Type.Parameter]]=..., value: typing.Optional[google.protobuf.any_pb2.Any]=...) -> None:
+            def __init__(self, *, type_reference: builtins.int=..., type_parameters: typing.Optional[typing.Iterable[substrait.ibis.type_pb2.Type.Parameter]]=..., value: typing.Optional[google.protobuf.any_pb2.Any]=...) -> None:
                 ...
 
             def HasField(self, field_name: typing_extensions.Literal['value', b'value']) -> builtins.bool:
@@ -1452,7 +1452,7 @@ class Expression(google.protobuf.message.Message):
         uuid: builtins.bytes
 
         @property
-        def null(self) -> substrait.type_pb2.Type:
+        def null(self) -> substrait.ibis.type_pb2.Type:
             """a typed null literal"""
             pass
 
@@ -1461,11 +1461,11 @@ class Expression(google.protobuf.message.Message):
             ...
 
         @property
-        def empty_list(self) -> substrait.type_pb2.Type.List:
+        def empty_list(self) -> substrait.ibis.type_pb2.Type.List:
             ...
 
         @property
-        def empty_map(self) -> substrait.type_pb2.Type.Map:
+        def empty_map(self) -> substrait.ibis.type_pb2.Type.Map:
             ...
 
         @property
@@ -1476,7 +1476,7 @@ class Expression(google.protobuf.message.Message):
         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: typing.Text=..., binary: builtins.bytes=..., timestamp: builtins.int=..., date: builtins.int=..., time: builtins.int=..., interval_year_to_month: typing.Optional[global___Expression.Literal.IntervalYearToMonth]=..., interval_day_to_second: typing.Optional[global___Expression.Literal.IntervalDayToSecond]=..., fixed_char: typing.Text=..., var_char: typing.Optional[global___Expression.Literal.VarChar]=..., fixed_binary: builtins.bytes=..., decimal: typing.Optional[global___Expression.Literal.Decimal]=..., struct: typing.Optional[global___Expression.Literal.Struct]=..., map: typing.Optional[global___Expression.Literal.Map]=..., timestamp_tz: builtins.int=..., uuid: builtins.bytes=..., null: typing.Optional[substrait.type_pb2.Type]=..., list: typing.Optional[global___Expression.Literal.List]=..., empty_list: typing.Optional[substrait.type_pb2.Type.List]=..., empty_map: typing.Optional[substrait.type_pb2.Type.Map]=..., user_defined: typing.Optional[global___Expression.Literal.UserDefined]=..., nullable: builtins.bool=..., type_variation_reference: builtins.int=...) -> None:
+        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: typing.Text=..., binary: builtins.bytes=..., timestamp: builtins.int=..., date: builtins.int=..., time: builtins.int=..., interval_year_to_month: typing.Optional[global___Expression.Literal.IntervalYearToMonth]=..., interval_day_to_second: typing.Optional[global___Expression.Literal.IntervalDayToSecond]=..., fixed_char: typing.Text=..., var_char: typing.Optional[global___Expression.Literal.VarChar]=..., fixed_binary: builtins.bytes=..., decimal: typing.Optional[global___Expression.Literal.Decimal]=..., struct: typing.Optional[global___Expression.Literal.Struct]=..., map: typing.Optional[global___Expression.Literal.Map]=..., timestamp_tz: builtins.int=..., uuid: builtins.bytes=..., null: typing.Optional[substrait.ibis.type_pb2.Type]=..., list: typing.Optional[global___Expression.Literal.List]=..., empty_list: typing.Optional[substrait.ibis.type_pb2.Type.List]=..., empty_map: typing.Optional[substrait.ibis.type_pb2.Type.Map]=..., user_defined: typing.Optional[global___Expression.Literal.UserDefined]=..., 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:
@@ -1502,7 +1502,7 @@ class Expression(google.protobuf.message.Message):
             ...
 
         @property
-        def output_type(self) -> substrait.type_pb2.Type:
+        def output_type(self) -> substrait.ibis.type_pb2.Type:
             ...
 
         @property
@@ -1510,7 +1510,7 @@ class Expression(google.protobuf.message.Message):
             """deprecated; use args instead"""
             pass
 
-        def __init__(self, *, function_reference: builtins.int=..., arguments: typing.Optional[typing.Iterable[global___FunctionArgument]]=..., output_type: typing.Optional[substrait.type_pb2.Type]=..., args: typing.Optional[typing.Iterable[global___Expression]]=...) -> None:
+        def __init__(self, *, function_reference: builtins.int=..., arguments: typing.Optional[typing.Iterable[global___FunctionArgument]]=..., output_type: typing.Optional[substrait.ibis.type_pb2.Type]=..., args: typing.Optional[typing.Iterable[global___Expression]]=...) -> None:
             ...
 
         def HasField(self, field_name: typing_extensions.Literal['output_type', b'output_type']) -> builtins.bool:
@@ -1620,7 +1620,7 @@ class Expression(google.protobuf.message.Message):
         phase: global___AggregationPhase.ValueType
 
         @property
-        def output_type(self) -> substrait.type_pb2.Type:
+        def output_type(self) -> substrait.ibis.type_pb2.Type:
             ...
 
         @property
@@ -1632,7 +1632,7 @@ class Expression(google.protobuf.message.Message):
             """deprecated; use args instead"""
             pass
 
-        def __init__(self, *, function_reference: builtins.int=..., partitions: typing.Optional[typing.Iterable[global___Expression]]=..., sorts: typing.Optional[typing.Iterable[global___SortField]]=..., upper_bound: typing.Optional[global___Expression.WindowFunction.Bound]=..., lower_bound: typing.Optional[global___Expression.WindowFunction.Bound]=..., phase: global___AggregationPhase.ValueType=..., output_type: typing.Optional[substrait.type_pb2.Type]=..., arguments: typing.Optional[typing.Iterable[global___FunctionArgument]]=..., args: typing.Optional[typing.Iterable[global___Expression]]=...) -> None:
+        def __init__(self, *, function_reference: builtins.int=..., partitions: typing.Optional[typing.Iterable[global___Expression]]=..., sorts: typing.Optional[typing.Iterable[global___SortField]]=..., upper_bound: typing.Optional[global___Expression.WindowFunction.Bound]=..., lower_bound: typing.Optional[global___Expression.WindowFunction.Bound]=..., phase: global___AggregationPhase.ValueType=..., output_type: typing.Optional[substrait.ibis.type_pb2.Type]=..., arguments: typing.Optional[typing.Iterable[global___FunctionArgument]]=..., args: typing.Optional[typing.Iterable[global___Expression]]=...) -> 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:
@@ -1700,7 +1700,7 @@ class Expression(google.protobuf.message.Message):
         FAILURE_BEHAVIOR_FIELD_NUMBER: builtins.int
 
         @property
-        def type(self) -> substrait.type_pb2.Type:
+        def type(self) -> substrait.ibis.type_pb2.Type:
             ...
 
         @property
@@ -1708,7 +1708,7 @@ class Expression(google.protobuf.message.Message):
             ...
         failure_behavior: global___Expression.Cast.FailureBehavior.ValueType
 
-        def __init__(self, *, type: typing.Optional[substrait.type_pb2.Type]=..., input: typing.Optional[global___Expression]=..., failure_behavior: global___Expression.Cast.FailureBehavior.ValueType=...) -> None:
+        def __init__(self, *, type: typing.Optional[substrait.ibis.type_pb2.Type]=..., input: typing.Optional[global___Expression]=..., failure_behavior: global___Expression.Cast.FailureBehavior.ValueType=...) -> None:
             ...
 
         def HasField(self, field_name: typing_extensions.Literal['input', b'input', 'type', b'type']) -> builtins.bool:
@@ -1857,7 +1857,7 @@ class Expression(google.protobuf.message.Message):
             ...
 
         @property
-        def output_type(self) -> substrait.type_pb2.Type:
+        def output_type(self) -> substrait.ibis.type_pb2.Type:
             ...
 
         @property
@@ -1868,7 +1868,7 @@ class Expression(google.protobuf.message.Message):
         def web_assembly_function(self) -> global___Expression.EmbeddedFunction.WebAssemblyFunction:
             ...
 
-        def __init__(self, *, arguments: typing.Optional[typing.Iterable[global___Expression]]=..., output_type: typing.Optional[substrait.type_pb2.Type]=..., python_pickle_function: typing.Optional[global___Expression.EmbeddedFunction.PythonPickleFunction]=..., web_assembly_function: typing.Optional[global___Expression.EmbeddedFunction.WebAssemblyFunction]=...) -> None:
+        def __init__(self, *, arguments: typing.Optional[typing.Iterable[global___Expression]]=..., output_type: typing.Optional[substrait.ibis.type_pb2.Type]=..., python_pickle_function: typing.Optional[global___Expression.EmbeddedFunction.PythonPickleFunction]=..., web_assembly_function: typing.Optional[global___Expression.EmbeddedFunction.WebAssemblyFunction]=...) -> 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:
@@ -2637,7 +2637,7 @@ class AggregateFunction(google.protobuf.message.Message):
     phase: global___AggregationPhase.ValueType
 
     @property
-    def output_type(self) -> substrait.type_pb2.Type:
+    def output_type(self) -> substrait.ibis.type_pb2.Type:
         ...
     invocation: global___AggregateFunction.AggregationInvocation.ValueType
 
@@ -2646,7 +2646,7 @@ class AggregateFunction(google.protobuf.message.Message):
         """deprecated; use args instead"""
         pass
 
-    def __init__(self, *, function_reference: builtins.int=..., arguments: typing.Optional[typing.Iterable[global___FunctionArgument]]=..., sorts: typing.Optional[typing.Iterable[global___SortField]]=..., phase: global___AggregationPhase.ValueType=..., output_type: typing.Optional[substrait.type_pb2.Type]=..., invocation: global___AggregateFunction.AggregationInvocation.ValueType=..., args: typing.Optional[typing.Iterable[global___Expression]]=...) -> None:
+    def __init__(self, *, function_reference: builtins.int=..., arguments: typing.Optional[typing.Iterable[global___FunctionArgument]]=..., sorts: typing.Optional[typing.Iterable[global___SortField]]=..., phase: global___AggregationPhase.ValueType=..., output_type: typing.Optional[substrait.ibis.type_pb2.Type]=..., invocation: global___AggregateFunction.AggregationInvocation.ValueType=..., args: typing.Optional[typing.Iterable[global___Expression]]=...) -> None:
         ...
 
     def HasField(self, field_name: typing_extensions.Literal['output_type', b'output_type']) -> builtins.bool:
diff --git a/ibis_substrait/proto/substrait/ibis/capabilities_pb2.py b/ibis_substrait/proto/substrait/ibis/capabilities_pb2.py
new file mode 100644
index 00000000..8e6278ab
--- /dev/null
+++ b/ibis_substrait/proto/substrait/ibis/capabilities_pb2.py
@@ -0,0 +1,16 @@
+"""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/capabilities_pb2.pyi b/ibis_substrait/proto/substrait/ibis/capabilities_pb2.pyi
similarity index 100%
rename from ibis_substrait/proto/substrait/capabilities_pb2.pyi
rename to ibis_substrait/proto/substrait/ibis/capabilities_pb2.pyi
diff --git a/ibis_substrait/proto/substrait/ibis/extensions/__init__.py b/ibis_substrait/proto/substrait/ibis/extensions/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/ibis_substrait/proto/substrait/extensions/__init__.pyi b/ibis_substrait/proto/substrait/ibis/extensions/__init__.pyi
similarity index 100%
rename from ibis_substrait/proto/substrait/extensions/__init__.pyi
rename to ibis_substrait/proto/substrait/ibis/extensions/__init__.pyi
diff --git a/ibis_substrait/proto/substrait/ibis/extensions/extensions_pb2.py b/ibis_substrait/proto/substrait/ibis/extensions/extensions_pb2.py
new file mode 100644
index 00000000..02b452c1
--- /dev/null
+++ b/ibis_substrait/proto/substrait/ibis/extensions/extensions_pb2.py
@@ -0,0 +1,25 @@
+"""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/extensions/extensions_pb2.pyi b/ibis_substrait/proto/substrait/ibis/extensions/extensions_pb2.pyi
similarity index 100%
rename from ibis_substrait/proto/substrait/extensions/extensions_pb2.pyi
rename to ibis_substrait/proto/substrait/ibis/extensions/extensions_pb2.pyi
diff --git a/ibis_substrait/proto/substrait/ibis/function_pb2.py b/ibis_substrait/proto/substrait/ibis/function_pb2.py
new file mode 100644
index 00000000..26bdedb9
--- /dev/null
+++ b/ibis_substrait/proto/substrait/ibis/function_pb2.py
@@ -0,0 +1,45 @@
+"""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/function_pb2.pyi b/ibis_substrait/proto/substrait/ibis/function_pb2.pyi
similarity index 89%
rename from ibis_substrait/proto/substrait/function_pb2.pyi
rename to ibis_substrait/proto/substrait/ibis/function_pb2.pyi
index cdfa8282..73288834 100644
--- a/ibis_substrait/proto/substrait/function_pb2.pyi
+++ b/ibis_substrait/proto/substrait/ibis/function_pb2.pyi
@@ -7,7 +7,7 @@ import google.protobuf.descriptor
 import google.protobuf.internal.containers
 import google.protobuf.internal.enum_type_wrapper
 import google.protobuf.message
-from .. import substrait
+from ... import substrait
 import typing
 import typing_extensions
 DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@@ -87,7 +87,7 @@ class FunctionSignature(google.protobuf.message.Message):
         session_dependent: builtins.bool
 
         @property
-        def output_type(self) -> substrait.type_expressions_pb2.DerivationExpression:
+        def output_type(self) -> substrait.ibis.type_expressions_pb2.DerivationExpression:
             ...
 
         @property
@@ -102,7 +102,7 @@ class FunctionSignature(google.protobuf.message.Message):
         def implementations(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FunctionSignature.Implementation]:
             ...
 
-        def __init__(self, *, arguments: typing.Optional[typing.Iterable[global___FunctionSignature.Argument]]=..., name: typing.Optional[typing.Iterable[typing.Text]]=..., description: typing.Optional[global___FunctionSignature.Description]=..., deterministic: builtins.bool=..., session_dependent: builtins.bool=..., output_type: typing.Optional[substrait.type_expressions_pb2.DerivationExpression]=..., variadic: typing.Optional[global___FunctionSignature.FinalArgVariadic]=..., normal: typing.Optional[global___FunctionSignature.FinalArgNormal]=..., implementations: typing.Optional[typing.Iterable[global___FunctionSignature.Implementation]]=...) -> None:
+        def __init__(self, *, arguments: typing.Optional[typing.Iterable[global___FunctionSignature.Argument]]=..., name: typing.Optional[typing.Iterable[typing.Text]]=..., description: typing.Optional[global___FunctionSignature.Description]=..., deterministic: builtins.bool=..., session_dependent: builtins.bool=..., output_type: typing.Optional[substrait.ibis.type_expressions_pb2.DerivationExpression]=..., variadic: typing.Optional[global___FunctionSignature.FinalArgVariadic]=..., normal: typing.Optional[global___FunctionSignature.FinalArgNormal]=..., implementations: typing.Optional[typing.Iterable[global___FunctionSignature.Implementation]]=...) -> 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:
@@ -141,7 +141,7 @@ class FunctionSignature(google.protobuf.message.Message):
         session_dependent: builtins.bool
 
         @property
-        def output_type(self) -> substrait.type_expressions_pb2.DerivationExpression:
+        def output_type(self) -> substrait.ibis.type_expressions_pb2.DerivationExpression:
             ...
 
         @property
@@ -155,14 +155,14 @@ class FunctionSignature(google.protobuf.message.Message):
         max_set: builtins.int
 
         @property
-        def intermediate_type(self) -> substrait.type_pb2.Type:
+        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: typing.Optional[typing.Iterable[global___FunctionSignature.Argument]]=..., name: typing.Text=..., description: typing.Optional[global___FunctionSignature.Description]=..., deterministic: builtins.bool=..., session_dependent: builtins.bool=..., output_type: typing.Optional[substrait.type_expressions_pb2.DerivationExpression]=..., variadic: typing.Optional[global___FunctionSignature.FinalArgVariadic]=..., normal: typing.Optional[global___FunctionSignature.FinalArgNormal]=..., ordered: builtins.bool=..., max_set: builtins.int=..., intermediate_type: typing.Optional[substrait.type_pb2.Type]=..., implementations: typing.Optional[typing.Iterable[global___FunctionSignature.Implementation]]=...) -> None:
+        def __init__(self, *, arguments: typing.Optional[typing.Iterable[global___FunctionSignature.Argument]]=..., name: typing.Text=..., description: typing.Optional[global___FunctionSignature.Description]=..., deterministic: builtins.bool=..., session_dependent: builtins.bool=..., output_type: typing.Optional[substrait.ibis.type_expressions_pb2.DerivationExpression]=..., variadic: typing.Optional[global___FunctionSignature.FinalArgVariadic]=..., normal: typing.Optional[global___FunctionSignature.FinalArgNormal]=..., ordered: builtins.bool=..., max_set: builtins.int=..., intermediate_type: typing.Optional[substrait.ibis.type_pb2.Type]=..., implementations: typing.Optional[typing.Iterable[global___FunctionSignature.Implementation]]=...) -> 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:
@@ -221,11 +221,11 @@ class FunctionSignature(google.protobuf.message.Message):
         session_dependent: builtins.bool
 
         @property
-        def intermediate_type(self) -> substrait.type_expressions_pb2.DerivationExpression:
+        def intermediate_type(self) -> substrait.ibis.type_expressions_pb2.DerivationExpression:
             ...
 
         @property
-        def output_type(self) -> substrait.type_expressions_pb2.DerivationExpression:
+        def output_type(self) -> substrait.ibis.type_expressions_pb2.DerivationExpression:
             ...
 
         @property
@@ -243,7 +243,7 @@ class FunctionSignature(google.protobuf.message.Message):
         def implementations(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FunctionSignature.Implementation]:
             ...
 
-        def __init__(self, *, arguments: typing.Optional[typing.Iterable[global___FunctionSignature.Argument]]=..., name: typing.Optional[typing.Iterable[typing.Text]]=..., description: typing.Optional[global___FunctionSignature.Description]=..., deterministic: builtins.bool=..., session_dependent: builtins.bool=..., intermediate_type: typing.Optional[substrait.type_expressions_pb2.DerivationExpression]=..., output_type: typing.Optional[substrait.type_expressions_pb2.DerivationExpression]=..., variadic: typing.Optional[global___FunctionSignature.FinalArgVariadic]=..., normal: typing.Optional[global___FunctionSignature.FinalArgNormal]=..., ordered: builtins.bool=..., max_set: builtins.int=..., window_type: global___FunctionSignature.Window.WindowType.ValueType=..., implementations: typing.Optional[typing.Iterable[global___FunctionSignature.Implementation]]=...) -> None:
+        def __init__(self, *, arguments: typing.Optional[typing.Iterable[global___FunctionSignature.Argument]]=..., name: typing.Optional[typing.Iterable[typing.Text]]=..., description: typing.Optional[global___FunctionSignature.Description]=..., deterministic: builtins.bool=..., session_dependent: builtins.bool=..., intermediate_type: typing.Optional[substrait.ibis.type_expressions_pb2.DerivationExpression]=..., output_type: typing.Optional[substrait.ibis.type_expressions_pb2.DerivationExpression]=..., variadic: typing.Optional[global___FunctionSignature.FinalArgVariadic]=..., normal: typing.Optional[global___FunctionSignature.FinalArgNormal]=..., ordered: builtins.bool=..., max_set: builtins.int=..., window_type: global___FunctionSignature.Window.WindowType.ValueType=..., implementations: typing.Optional[typing.Iterable[global___FunctionSignature.Implementation]]=...) -> 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:
@@ -306,11 +306,11 @@ class FunctionSignature(google.protobuf.message.Message):
             CONSTANT_FIELD_NUMBER: builtins.int
 
             @property
-            def type(self) -> substrait.parameterized_types_pb2.ParameterizedType:
+            def type(self) -> substrait.ibis.parameterized_types_pb2.ParameterizedType:
                 ...
             constant: builtins.bool
 
-            def __init__(self, *, type: typing.Optional[substrait.parameterized_types_pb2.ParameterizedType]=..., constant: builtins.bool=...) -> None:
+            def __init__(self, *, type: typing.Optional[substrait.ibis.parameterized_types_pb2.ParameterizedType]=..., constant: builtins.bool=...) -> None:
                 ...
 
             def HasField(self, field_name: typing_extensions.Literal['type', b'type']) -> builtins.bool:
@@ -324,10 +324,10 @@ class FunctionSignature(google.protobuf.message.Message):
             TYPE_FIELD_NUMBER: builtins.int
 
             @property
-            def type(self) -> substrait.parameterized_types_pb2.ParameterizedType:
+            def type(self) -> substrait.ibis.parameterized_types_pb2.ParameterizedType:
                 ...
 
-            def __init__(self, *, type: typing.Optional[substrait.parameterized_types_pb2.ParameterizedType]=...) -> None:
+            def __init__(self, *, type: typing.Optional[substrait.ibis.parameterized_types_pb2.ParameterizedType]=...) -> None:
                 ...
 
             def HasField(self, field_name: typing_extensions.Literal['type', b'type']) -> builtins.bool:
diff --git a/ibis_substrait/proto/substrait/ibis/parameterized_types_pb2.py b/ibis_substrait/proto/substrait/ibis/parameterized_types_pb2.py
new file mode 100644
index 00000000..64696fcf
--- /dev/null
+++ b/ibis_substrait/proto/substrait/ibis/parameterized_types_pb2.py
@@ -0,0 +1,43 @@
+"""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/parameterized_types_pb2.pyi b/ibis_substrait/proto/substrait/ibis/parameterized_types_pb2.pyi
similarity index 79%
rename from ibis_substrait/proto/substrait/parameterized_types_pb2.pyi
rename to ibis_substrait/proto/substrait/ibis/parameterized_types_pb2.pyi
index 4229ecec..bbc2113e 100644
--- a/ibis_substrait/proto/substrait/parameterized_types_pb2.pyi
+++ b/ibis_substrait/proto/substrait/ibis/parameterized_types_pb2.pyi
@@ -6,7 +6,7 @@ import builtins
 import google.protobuf.descriptor
 import google.protobuf.internal.containers
 import google.protobuf.message
-from .. import substrait
+from ... import substrait
 import typing
 import typing_extensions
 DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@@ -75,9 +75,9 @@ class ParameterizedType(google.protobuf.message.Message):
         def length(self) -> global___ParameterizedType.IntegerOption:
             ...
         variation_pointer: builtins.int
-        nullability: substrait.type_pb2.Type.Nullability.ValueType
+        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
 
-        def __init__(self, *, length: typing.Optional[global___ParameterizedType.IntegerOption]=..., variation_pointer: builtins.int=..., nullability: substrait.type_pb2.Type.Nullability.ValueType=...) -> None:
+        def __init__(self, *, length: typing.Optional[global___ParameterizedType.IntegerOption]=..., 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:
@@ -96,9 +96,9 @@ class ParameterizedType(google.protobuf.message.Message):
         def length(self) -> global___ParameterizedType.IntegerOption:
             ...
         variation_pointer: builtins.int
-        nullability: substrait.type_pb2.Type.Nullability.ValueType
+        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
 
-        def __init__(self, *, length: typing.Optional[global___ParameterizedType.IntegerOption]=..., variation_pointer: builtins.int=..., nullability: substrait.type_pb2.Type.Nullability.ValueType=...) -> None:
+        def __init__(self, *, length: typing.Optional[global___ParameterizedType.IntegerOption]=..., 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:
@@ -117,9 +117,9 @@ class ParameterizedType(google.protobuf.message.Message):
         def length(self) -> global___ParameterizedType.IntegerOption:
             ...
         variation_pointer: builtins.int
-        nullability: substrait.type_pb2.Type.Nullability.ValueType
+        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
 
-        def __init__(self, *, length: typing.Optional[global___ParameterizedType.IntegerOption]=..., variation_pointer: builtins.int=..., nullability: substrait.type_pb2.Type.Nullability.ValueType=...) -> None:
+        def __init__(self, *, length: typing.Optional[global___ParameterizedType.IntegerOption]=..., 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:
@@ -143,9 +143,9 @@ class ParameterizedType(google.protobuf.message.Message):
         def precision(self) -> global___ParameterizedType.IntegerOption:
             ...
         variation_pointer: builtins.int
-        nullability: substrait.type_pb2.Type.Nullability.ValueType
+        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
 
-        def __init__(self, *, scale: typing.Optional[global___ParameterizedType.IntegerOption]=..., precision: typing.Optional[global___ParameterizedType.IntegerOption]=..., variation_pointer: builtins.int=..., nullability: substrait.type_pb2.Type.Nullability.ValueType=...) -> None:
+        def __init__(self, *, scale: typing.Optional[global___ParameterizedType.IntegerOption]=..., precision: typing.Optional[global___ParameterizedType.IntegerOption]=..., 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:
@@ -164,9 +164,9 @@ class ParameterizedType(google.protobuf.message.Message):
         def types(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ParameterizedType]:
             ...
         variation_pointer: builtins.int
-        nullability: substrait.type_pb2.Type.Nullability.ValueType
+        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
 
-        def __init__(self, *, types: typing.Optional[typing.Iterable[global___ParameterizedType]]=..., variation_pointer: builtins.int=..., nullability: substrait.type_pb2.Type.Nullability.ValueType=...) -> None:
+        def __init__(self, *, types: typing.Optional[typing.Iterable[global___ParameterizedType]]=..., 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:
@@ -205,9 +205,9 @@ class ParameterizedType(google.protobuf.message.Message):
         def type(self) -> global___ParameterizedType:
             ...
         variation_pointer: builtins.int
-        nullability: substrait.type_pb2.Type.Nullability.ValueType
+        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
 
-        def __init__(self, *, type: typing.Optional[global___ParameterizedType]=..., variation_pointer: builtins.int=..., nullability: substrait.type_pb2.Type.Nullability.ValueType=...) -> None:
+        def __init__(self, *, type: typing.Optional[global___ParameterizedType]=..., 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:
@@ -231,9 +231,9 @@ class ParameterizedType(google.protobuf.message.Message):
         def value(self) -> global___ParameterizedType:
             ...
         variation_pointer: builtins.int
-        nullability: substrait.type_pb2.Type.Nullability.ValueType
+        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
 
-        def __init__(self, *, key: typing.Optional[global___ParameterizedType]=..., value: typing.Optional[global___ParameterizedType]=..., variation_pointer: builtins.int=..., nullability: substrait.type_pb2.Type.Nullability.ValueType=...) -> None:
+        def __init__(self, *, key: typing.Optional[global___ParameterizedType]=..., value: typing.Optional[global___ParameterizedType]=..., 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:
@@ -249,9 +249,9 @@ class ParameterizedType(google.protobuf.message.Message):
         NULLABILITY_FIELD_NUMBER: builtins.int
         type_pointer: builtins.int
         variation_pointer: builtins.int
-        nullability: substrait.type_pb2.Type.Nullability.ValueType
+        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
 
-        def __init__(self, *, type_pointer: builtins.int=..., variation_pointer: builtins.int=..., nullability: substrait.type_pb2.Type.Nullability.ValueType=...) -> None:
+        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:
@@ -306,67 +306,67 @@ class ParameterizedType(google.protobuf.message.Message):
     TYPE_PARAMETER_FIELD_NUMBER: builtins.int
 
     @property
-    def bool(self) -> substrait.type_pb2.Type.Boolean:
+    def bool(self) -> substrait.ibis.type_pb2.Type.Boolean:
         ...
 
     @property
-    def i8(self) -> substrait.type_pb2.Type.I8:
+    def i8(self) -> substrait.ibis.type_pb2.Type.I8:
         ...
 
     @property
-    def i16(self) -> substrait.type_pb2.Type.I16:
+    def i16(self) -> substrait.ibis.type_pb2.Type.I16:
         ...
 
     @property
-    def i32(self) -> substrait.type_pb2.Type.I32:
+    def i32(self) -> substrait.ibis.type_pb2.Type.I32:
         ...
 
     @property
-    def i64(self) -> substrait.type_pb2.Type.I64:
+    def i64(self) -> substrait.ibis.type_pb2.Type.I64:
         ...
 
     @property
-    def fp32(self) -> substrait.type_pb2.Type.FP32:
+    def fp32(self) -> substrait.ibis.type_pb2.Type.FP32:
         ...
 
     @property
-    def fp64(self) -> substrait.type_pb2.Type.FP64:
+    def fp64(self) -> substrait.ibis.type_pb2.Type.FP64:
         ...
 
     @property
-    def string(self) -> substrait.type_pb2.Type.String:
+    def string(self) -> substrait.ibis.type_pb2.Type.String:
         ...
 
     @property
-    def binary(self) -> substrait.type_pb2.Type.Binary:
+    def binary(self) -> substrait.ibis.type_pb2.Type.Binary:
         ...
 
     @property
-    def timestamp(self) -> substrait.type_pb2.Type.Timestamp:
+    def timestamp(self) -> substrait.ibis.type_pb2.Type.Timestamp:
         ...
 
     @property
-    def date(self) -> substrait.type_pb2.Type.Date:
+    def date(self) -> substrait.ibis.type_pb2.Type.Date:
         ...
 
     @property
-    def time(self) -> substrait.type_pb2.Type.Time:
+    def time(self) -> substrait.ibis.type_pb2.Type.Time:
         ...
 
     @property
-    def interval_year(self) -> substrait.type_pb2.Type.IntervalYear:
+    def interval_year(self) -> substrait.ibis.type_pb2.Type.IntervalYear:
         ...
 
     @property
-    def interval_day(self) -> substrait.type_pb2.Type.IntervalDay:
+    def interval_day(self) -> substrait.ibis.type_pb2.Type.IntervalDay:
         ...
 
     @property
-    def timestamp_tz(self) -> substrait.type_pb2.Type.TimestampTZ:
+    def timestamp_tz(self) -> substrait.ibis.type_pb2.Type.TimestampTZ:
         ...
 
     @property
-    def uuid(self) -> substrait.type_pb2.Type.UUID:
+    def uuid(self) -> substrait.ibis.type_pb2.Type.UUID:
         ...
 
     @property
@@ -407,7 +407,7 @@ class ParameterizedType(google.protobuf.message.Message):
     def type_parameter(self) -> global___ParameterizedType.TypeParameter:
         ...
 
-    def __init__(self, *, bool: typing.Optional[substrait.type_pb2.Type.Boolean]=..., i8: typing.Optional[substrait.type_pb2.Type.I8]=..., i16: typing.Optional[substrait.type_pb2.Type.I16]=..., i32: typing.Optional[substrait.type_pb2.Type.I32]=..., i64: typing.Optional[substrait.type_pb2.Type.I64]=..., fp32: typing.Optional[substrait.type_pb2.Type.FP32]=..., fp64: typing.Optional[substrait.type_pb2.Type.FP64]=..., string: typing.Optional[substrait.type_pb2.Type.String]=..., binary: typing.Optional[substrait.type_pb2.Type.Binary]=..., timestamp: typing.Optional[substrait.type_pb2.Type.Timestamp]=..., date: typing.Optional[substrait.type_pb2.Type.Date]=..., time: typing.Optional[substrait.type_pb2.Type.Time]=..., interval_year: typing.Optional[substrait.type_pb2.Type.IntervalYear]=..., interval_day: typing.Optional[substrait.type_pb2.Type.IntervalDay]=..., timestamp_tz: typing.Optional[substrait.type_pb2.Type.TimestampTZ]=..., uuid: typing.Optional[substrait.type_pb2.Type.UUID]=..., fixed_char: typing.Optional[global___ParameterizedType.ParameterizedFixedChar]=..., varchar: typing.Optional[global___ParameterizedType.ParameterizedVarChar]=..., fixed_binary: typing.Optional[global___ParameterizedType.ParameterizedFixedBinary]=..., decimal: typing.Optional[global___ParameterizedType.ParameterizedDecimal]=..., struct: typing.Optional[global___ParameterizedType.ParameterizedStruct]=..., list: typing.Optional[global___ParameterizedType.ParameterizedList]=..., map: typing.Optional[global___ParameterizedType.ParameterizedMap]=..., user_defined: typing.Optional[global___ParameterizedType.ParameterizedUserDefined]=..., user_defined_pointer: builtins.int=..., type_parameter: typing.Optional[global___ParameterizedType.TypeParameter]=...) -> None:
+    def __init__(self, *, bool: typing.Optional[substrait.ibis.type_pb2.Type.Boolean]=..., i8: typing.Optional[substrait.ibis.type_pb2.Type.I8]=..., i16: typing.Optional[substrait.ibis.type_pb2.Type.I16]=..., i32: typing.Optional[substrait.ibis.type_pb2.Type.I32]=..., i64: typing.Optional[substrait.ibis.type_pb2.Type.I64]=..., fp32: typing.Optional[substrait.ibis.type_pb2.Type.FP32]=..., fp64: typing.Optional[substrait.ibis.type_pb2.Type.FP64]=..., string: typing.Optional[substrait.ibis.type_pb2.Type.String]=..., binary: typing.Optional[substrait.ibis.type_pb2.Type.Binary]=..., timestamp: typing.Optional[substrait.ibis.type_pb2.Type.Timestamp]=..., date: typing.Optional[substrait.ibis.type_pb2.Type.Date]=..., time: typing.Optional[substrait.ibis.type_pb2.Type.Time]=..., interval_year: typing.Optional[substrait.ibis.type_pb2.Type.IntervalYear]=..., interval_day: typing.Optional[substrait.ibis.type_pb2.Type.IntervalDay]=..., timestamp_tz: typing.Optional[substrait.ibis.type_pb2.Type.TimestampTZ]=..., uuid: typing.Optional[substrait.ibis.type_pb2.Type.UUID]=..., fixed_char: typing.Optional[global___ParameterizedType.ParameterizedFixedChar]=..., varchar: typing.Optional[global___ParameterizedType.ParameterizedVarChar]=..., fixed_binary: typing.Optional[global___ParameterizedType.ParameterizedFixedBinary]=..., decimal: typing.Optional[global___ParameterizedType.ParameterizedDecimal]=..., struct: typing.Optional[global___ParameterizedType.ParameterizedStruct]=..., list: typing.Optional[global___ParameterizedType.ParameterizedList]=..., map: typing.Optional[global___ParameterizedType.ParameterizedMap]=..., user_defined: typing.Optional[global___ParameterizedType.ParameterizedUserDefined]=..., user_defined_pointer: builtins.int=..., type_parameter: typing.Optional[global___ParameterizedType.TypeParameter]=...) -> 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:
diff --git a/ibis_substrait/proto/substrait/ibis/plan_pb2.py b/ibis_substrait/proto/substrait/ibis/plan_pb2.py
new file mode 100644
index 00000000..a338ac7f
--- /dev/null
+++ b/ibis_substrait/proto/substrait/ibis/plan_pb2.py
@@ -0,0 +1,18 @@
+"""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"\xf7\x02\n\x04Plan\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\x10expectedTypeUrlsB5\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 = 606
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/plan_pb2.pyi b/ibis_substrait/proto/substrait/ibis/plan_pb2.pyi
similarity index 76%
rename from ibis_substrait/proto/substrait/plan_pb2.pyi
rename to ibis_substrait/proto/substrait/ibis/plan_pb2.pyi
index da9a7016..d6e6df44 100644
--- a/ibis_substrait/proto/substrait/plan_pb2.pyi
+++ b/ibis_substrait/proto/substrait/ibis/plan_pb2.pyi
@@ -6,7 +6,7 @@ import builtins
 import google.protobuf.descriptor
 import google.protobuf.internal.containers
 import google.protobuf.message
-from .. import substrait
+from ... import substrait
 import typing
 import typing_extensions
 DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@@ -18,16 +18,16 @@ class PlanRel(google.protobuf.message.Message):
     ROOT_FIELD_NUMBER: builtins.int
 
     @property
-    def rel(self) -> substrait.algebra_pb2.Rel:
+    def rel(self) -> substrait.ibis.algebra_pb2.Rel:
         """Any relation (used for references and CTEs)"""
         pass
 
     @property
-    def root(self) -> substrait.algebra_pb2.RelRoot:
+    def root(self) -> substrait.ibis.algebra_pb2.RelRoot:
         """The root of a relation tree"""
         pass
 
-    def __init__(self, *, rel: typing.Optional[substrait.algebra_pb2.Rel]=..., root: typing.Optional[substrait.algebra_pb2.RelRoot]=...) -> None:
+    def __init__(self, *, rel: typing.Optional[substrait.ibis.algebra_pb2.Rel]=..., root: typing.Optional[substrait.ibis.algebra_pb2.RelRoot]=...) -> None:
         ...
 
     def HasField(self, field_name: typing_extensions.Literal['rel', b'rel', 'rel_type', b'rel_type', 'root', b'root']) -> builtins.bool:
@@ -52,12 +52,12 @@ class Plan(google.protobuf.message.Message):
     EXPECTED_TYPE_URLS_FIELD_NUMBER: builtins.int
 
     @property
-    def extension_uris(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[substrait.extensions.extensions_pb2.SimpleExtensionURI]:
+    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"""
         pass
 
     @property
-    def extensions(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[substrait.extensions.extensions_pb2.SimpleExtensionDeclaration]:
+    def extensions(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[substrait.ibis.extensions.extensions_pb2.SimpleExtensionDeclaration]:
         """a list of extensions this plan may depend on"""
         pass
 
@@ -67,7 +67,7 @@ class Plan(google.protobuf.message.Message):
         pass
 
     @property
-    def advanced_extensions(self) -> substrait.extensions.extensions_pb2.AdvancedExtension:
+    def advanced_extensions(self) -> substrait.ibis.extensions.extensions_pb2.AdvancedExtension:
         """additional extensions associated with this plan."""
         pass
 
@@ -81,7 +81,7 @@ class Plan(google.protobuf.message.Message):
         """
         pass
 
-    def __init__(self, *, extension_uris: typing.Optional[typing.Iterable[substrait.extensions.extensions_pb2.SimpleExtensionURI]]=..., extensions: typing.Optional[typing.Iterable[substrait.extensions.extensions_pb2.SimpleExtensionDeclaration]]=..., relations: typing.Optional[typing.Iterable[global___PlanRel]]=..., advanced_extensions: typing.Optional[substrait.extensions.extensions_pb2.AdvancedExtension]=..., expected_type_urls: typing.Optional[typing.Iterable[typing.Text]]=...) -> None:
+    def __init__(self, *, extension_uris: typing.Optional[typing.Iterable[substrait.ibis.extensions.extensions_pb2.SimpleExtensionURI]]=..., extensions: typing.Optional[typing.Iterable[substrait.ibis.extensions.extensions_pb2.SimpleExtensionDeclaration]]=..., relations: typing.Optional[typing.Iterable[global___PlanRel]]=..., advanced_extensions: typing.Optional[substrait.ibis.extensions.extensions_pb2.AdvancedExtension]=..., expected_type_urls: typing.Optional[typing.Iterable[typing.Text]]=...) -> None:
         ...
 
     def HasField(self, field_name: typing_extensions.Literal['advanced_extensions', b'advanced_extensions']) -> builtins.bool:
diff --git a/ibis_substrait/proto/substrait/ibis/type_expressions_pb2.py b/ibis_substrait/proto/substrait/ibis/type_expressions_pb2.py
new file mode 100644
index 00000000..a02711e3
--- /dev/null
+++ b/ibis_substrait/proto/substrait/ibis/type_expressions_pb2.py
@@ -0,0 +1,49 @@
+"""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/type_expressions_pb2.pyi b/ibis_substrait/proto/substrait/ibis/type_expressions_pb2.pyi
similarity index 83%
rename from ibis_substrait/proto/substrait/type_expressions_pb2.pyi
rename to ibis_substrait/proto/substrait/ibis/type_expressions_pb2.pyi
index 81563588..5eb01d70 100644
--- a/ibis_substrait/proto/substrait/type_expressions_pb2.pyi
+++ b/ibis_substrait/proto/substrait/ibis/type_expressions_pb2.pyi
@@ -7,7 +7,7 @@ import google.protobuf.descriptor
 import google.protobuf.internal.containers
 import google.protobuf.internal.enum_type_wrapper
 import google.protobuf.message
-from .. import substrait
+from ... import substrait
 import typing
 import typing_extensions
 DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@@ -25,9 +25,9 @@ class DerivationExpression(google.protobuf.message.Message):
         def length(self) -> global___DerivationExpression:
             ...
         variation_pointer: builtins.int
-        nullability: substrait.type_pb2.Type.Nullability.ValueType
+        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
 
-        def __init__(self, *, length: typing.Optional[global___DerivationExpression]=..., variation_pointer: builtins.int=..., nullability: substrait.type_pb2.Type.Nullability.ValueType=...) -> None:
+        def __init__(self, *, length: typing.Optional[global___DerivationExpression]=..., 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:
@@ -46,9 +46,9 @@ class DerivationExpression(google.protobuf.message.Message):
         def length(self) -> global___DerivationExpression:
             ...
         variation_pointer: builtins.int
-        nullability: substrait.type_pb2.Type.Nullability.ValueType
+        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
 
-        def __init__(self, *, length: typing.Optional[global___DerivationExpression]=..., variation_pointer: builtins.int=..., nullability: substrait.type_pb2.Type.Nullability.ValueType=...) -> None:
+        def __init__(self, *, length: typing.Optional[global___DerivationExpression]=..., 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:
@@ -67,9 +67,9 @@ class DerivationExpression(google.protobuf.message.Message):
         def length(self) -> global___DerivationExpression:
             ...
         variation_pointer: builtins.int
-        nullability: substrait.type_pb2.Type.Nullability.ValueType
+        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
 
-        def __init__(self, *, length: typing.Optional[global___DerivationExpression]=..., variation_pointer: builtins.int=..., nullability: substrait.type_pb2.Type.Nullability.ValueType=...) -> None:
+        def __init__(self, *, length: typing.Optional[global___DerivationExpression]=..., 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:
@@ -93,9 +93,9 @@ class DerivationExpression(google.protobuf.message.Message):
         def precision(self) -> global___DerivationExpression:
             ...
         variation_pointer: builtins.int
-        nullability: substrait.type_pb2.Type.Nullability.ValueType
+        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
 
-        def __init__(self, *, scale: typing.Optional[global___DerivationExpression]=..., precision: typing.Optional[global___DerivationExpression]=..., variation_pointer: builtins.int=..., nullability: substrait.type_pb2.Type.Nullability.ValueType=...) -> None:
+        def __init__(self, *, scale: typing.Optional[global___DerivationExpression]=..., precision: typing.Optional[global___DerivationExpression]=..., 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:
@@ -114,9 +114,9 @@ class DerivationExpression(google.protobuf.message.Message):
         def types(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___DerivationExpression]:
             ...
         variation_pointer: builtins.int
-        nullability: substrait.type_pb2.Type.Nullability.ValueType
+        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
 
-        def __init__(self, *, types: typing.Optional[typing.Iterable[global___DerivationExpression]]=..., variation_pointer: builtins.int=..., nullability: substrait.type_pb2.Type.Nullability.ValueType=...) -> None:
+        def __init__(self, *, types: typing.Optional[typing.Iterable[global___DerivationExpression]]=..., 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:
@@ -154,9 +154,9 @@ class DerivationExpression(google.protobuf.message.Message):
         def type(self) -> global___DerivationExpression:
             ...
         variation_pointer: builtins.int
-        nullability: substrait.type_pb2.Type.Nullability.ValueType
+        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
 
-        def __init__(self, *, type: typing.Optional[global___DerivationExpression]=..., variation_pointer: builtins.int=..., nullability: substrait.type_pb2.Type.Nullability.ValueType=...) -> None:
+        def __init__(self, *, type: typing.Optional[global___DerivationExpression]=..., 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:
@@ -180,9 +180,9 @@ class DerivationExpression(google.protobuf.message.Message):
         def value(self) -> global___DerivationExpression:
             ...
         variation_pointer: builtins.int
-        nullability: substrait.type_pb2.Type.Nullability.ValueType
+        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
 
-        def __init__(self, *, key: typing.Optional[global___DerivationExpression]=..., value: typing.Optional[global___DerivationExpression]=..., variation_pointer: builtins.int=..., nullability: substrait.type_pb2.Type.Nullability.ValueType=...) -> None:
+        def __init__(self, *, key: typing.Optional[global___DerivationExpression]=..., value: typing.Optional[global___DerivationExpression]=..., 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:
@@ -198,9 +198,9 @@ class DerivationExpression(google.protobuf.message.Message):
         NULLABILITY_FIELD_NUMBER: builtins.int
         type_pointer: builtins.int
         variation_pointer: builtins.int
-        nullability: substrait.type_pb2.Type.Nullability.ValueType
+        nullability: substrait.ibis.type_pb2.Type.Nullability.ValueType
 
-        def __init__(self, *, type_pointer: builtins.int=..., variation_pointer: builtins.int=..., nullability: substrait.type_pb2.Type.Nullability.ValueType=...) -> None:
+        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:
@@ -400,67 +400,67 @@ class DerivationExpression(google.protobuf.message.Message):
     RETURN_PROGRAM_FIELD_NUMBER: builtins.int
 
     @property
-    def bool(self) -> substrait.type_pb2.Type.Boolean:
+    def bool(self) -> substrait.ibis.type_pb2.Type.Boolean:
         ...
 
     @property
-    def i8(self) -> substrait.type_pb2.Type.I8:
+    def i8(self) -> substrait.ibis.type_pb2.Type.I8:
         ...
 
     @property
-    def i16(self) -> substrait.type_pb2.Type.I16:
+    def i16(self) -> substrait.ibis.type_pb2.Type.I16:
         ...
 
     @property
-    def i32(self) -> substrait.type_pb2.Type.I32:
+    def i32(self) -> substrait.ibis.type_pb2.Type.I32:
         ...
 
     @property
-    def i64(self) -> substrait.type_pb2.Type.I64:
+    def i64(self) -> substrait.ibis.type_pb2.Type.I64:
         ...
 
     @property
-    def fp32(self) -> substrait.type_pb2.Type.FP32:
+    def fp32(self) -> substrait.ibis.type_pb2.Type.FP32:
         ...
 
     @property
-    def fp64(self) -> substrait.type_pb2.Type.FP64:
+    def fp64(self) -> substrait.ibis.type_pb2.Type.FP64:
         ...
 
     @property
-    def string(self) -> substrait.type_pb2.Type.String:
+    def string(self) -> substrait.ibis.type_pb2.Type.String:
         ...
 
     @property
-    def binary(self) -> substrait.type_pb2.Type.Binary:
+    def binary(self) -> substrait.ibis.type_pb2.Type.Binary:
         ...
 
     @property
-    def timestamp(self) -> substrait.type_pb2.Type.Timestamp:
+    def timestamp(self) -> substrait.ibis.type_pb2.Type.Timestamp:
         ...
 
     @property
-    def date(self) -> substrait.type_pb2.Type.Date:
+    def date(self) -> substrait.ibis.type_pb2.Type.Date:
         ...
 
     @property
-    def time(self) -> substrait.type_pb2.Type.Time:
+    def time(self) -> substrait.ibis.type_pb2.Type.Time:
         ...
 
     @property
-    def interval_year(self) -> substrait.type_pb2.Type.IntervalYear:
+    def interval_year(self) -> substrait.ibis.type_pb2.Type.IntervalYear:
         ...
 
     @property
-    def interval_day(self) -> substrait.type_pb2.Type.IntervalDay:
+    def interval_day(self) -> substrait.ibis.type_pb2.Type.IntervalDay:
         ...
 
     @property
-    def timestamp_tz(self) -> substrait.type_pb2.Type.TimestampTZ:
+    def timestamp_tz(self) -> substrait.ibis.type_pb2.Type.TimestampTZ:
         ...
 
     @property
-    def uuid(self) -> substrait.type_pb2.Type.UUID:
+    def uuid(self) -> substrait.ibis.type_pb2.Type.UUID:
         ...
 
     @property
@@ -516,7 +516,7 @@ class DerivationExpression(google.protobuf.message.Message):
     def return_program(self) -> global___DerivationExpression.ReturnProgram:
         ...
 
-    def __init__(self, *, bool: typing.Optional[substrait.type_pb2.Type.Boolean]=..., i8: typing.Optional[substrait.type_pb2.Type.I8]=..., i16: typing.Optional[substrait.type_pb2.Type.I16]=..., i32: typing.Optional[substrait.type_pb2.Type.I32]=..., i64: typing.Optional[substrait.type_pb2.Type.I64]=..., fp32: typing.Optional[substrait.type_pb2.Type.FP32]=..., fp64: typing.Optional[substrait.type_pb2.Type.FP64]=..., string: typing.Optional[substrait.type_pb2.Type.String]=..., binary: typing.Optional[substrait.type_pb2.Type.Binary]=..., timestamp: typing.Optional[substrait.type_pb2.Type.Timestamp]=..., date: typing.Optional[substrait.type_pb2.Type.Date]=..., time: typing.Optional[substrait.type_pb2.Type.Time]=..., interval_year: typing.Optional[substrait.type_pb2.Type.IntervalYear]=..., interval_day: typing.Optional[substrait.type_pb2.Type.IntervalDay]=..., timestamp_tz: typing.Optional[substrait.type_pb2.Type.TimestampTZ]=..., uuid: typing.Optional[substrait.type_pb2.Type.UUID]=..., fixed_char: typing.Optional[global___DerivationExpression.ExpressionFixedChar]=..., varchar: typing.Optional[global___DerivationExpression.ExpressionVarChar]=..., fixed_binary: typing.Optional[global___DerivationExpression.ExpressionFixedBinary]=..., decimal: typing.Optional[global___DerivationExpression.ExpressionDecimal]=..., struct: typing.Optional[global___DerivationExpression.ExpressionStruct]=..., list: typing.Optional[global___DerivationExpression.ExpressionList]=..., map: typing.Optional[global___DerivationExpression.ExpressionMap]=..., user_defined: typing.Optional[global___DerivationExpression.ExpressionUserDefined]=..., user_defined_pointer: builtins.int=..., type_parameter_name: typing.Text=..., integer_parameter_name: typing.Text=..., integer_literal: builtins.int=..., unary_op: typing.Optional[global___DerivationExpression.UnaryOp]=..., binary_op: typing.Optional[global___DerivationExpression.BinaryOp]=..., if_else: typing.Optional[global___DerivationExpression.IfElse]=..., return_program: typing.Optional[global___DerivationExpression.ReturnProgram]=...) -> None:
+    def __init__(self, *, bool: typing.Optional[substrait.ibis.type_pb2.Type.Boolean]=..., i8: typing.Optional[substrait.ibis.type_pb2.Type.I8]=..., i16: typing.Optional[substrait.ibis.type_pb2.Type.I16]=..., i32: typing.Optional[substrait.ibis.type_pb2.Type.I32]=..., i64: typing.Optional[substrait.ibis.type_pb2.Type.I64]=..., fp32: typing.Optional[substrait.ibis.type_pb2.Type.FP32]=..., fp64: typing.Optional[substrait.ibis.type_pb2.Type.FP64]=..., string: typing.Optional[substrait.ibis.type_pb2.Type.String]=..., binary: typing.Optional[substrait.ibis.type_pb2.Type.Binary]=..., timestamp: typing.Optional[substrait.ibis.type_pb2.Type.Timestamp]=..., date: typing.Optional[substrait.ibis.type_pb2.Type.Date]=..., time: typing.Optional[substrait.ibis.type_pb2.Type.Time]=..., interval_year: typing.Optional[substrait.ibis.type_pb2.Type.IntervalYear]=..., interval_day: typing.Optional[substrait.ibis.type_pb2.Type.IntervalDay]=..., timestamp_tz: typing.Optional[substrait.ibis.type_pb2.Type.TimestampTZ]=..., uuid: typing.Optional[substrait.ibis.type_pb2.Type.UUID]=..., fixed_char: typing.Optional[global___DerivationExpression.ExpressionFixedChar]=..., varchar: typing.Optional[global___DerivationExpression.ExpressionVarChar]=..., fixed_binary: typing.Optional[global___DerivationExpression.ExpressionFixedBinary]=..., decimal: typing.Optional[global___DerivationExpression.ExpressionDecimal]=..., struct: typing.Optional[global___DerivationExpression.ExpressionStruct]=..., list: typing.Optional[global___DerivationExpression.ExpressionList]=..., map: typing.Optional[global___DerivationExpression.ExpressionMap]=..., user_defined: typing.Optional[global___DerivationExpression.ExpressionUserDefined]=..., user_defined_pointer: builtins.int=..., type_parameter_name: typing.Text=..., integer_parameter_name: typing.Text=..., integer_literal: builtins.int=..., unary_op: typing.Optional[global___DerivationExpression.UnaryOp]=..., binary_op: typing.Optional[global___DerivationExpression.BinaryOp]=..., if_else: typing.Optional[global___DerivationExpression.IfElse]=..., return_program: typing.Optional[global___DerivationExpression.ReturnProgram]=...) -> 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:
diff --git a/ibis_substrait/proto/substrait/ibis/type_pb2.py b/ibis_substrait/proto/substrait/ibis/type_pb2.py
new file mode 100644
index 00000000..116cb846
--- /dev/null
+++ b/ibis_substrait/proto/substrait/ibis/type_pb2.py
@@ -0,0 +1,71 @@
+"""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/type_pb2.pyi b/ibis_substrait/proto/substrait/ibis/type_pb2.pyi
similarity index 100%
rename from ibis_substrait/proto/substrait/type_pb2.pyi
rename to ibis_substrait/proto/substrait/ibis/type_pb2.pyi
diff --git a/ibis_substrait/proto/substrait/parameterized_types_pb2.py b/ibis_substrait/proto/substrait/parameterized_types_pb2.py
deleted file mode 100644
index 488d3257..00000000
--- a/ibis_substrait/proto/substrait/parameterized_types_pb2.py
+++ /dev/null
@@ -1,71 +0,0 @@
-"""Generated protocol buffer code."""
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-from google.protobuf import symbol_database as _symbol_database
-_sym_db = _symbol_database.Default()
-from ..substrait import type_pb2 as substrait_dot_type__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#substrait/parameterized_types.proto\x12\tsubstrait\x1a\x14substrait/type.proto"\xa2\x1e\n\x11ParameterizedType\x12-\n\x04bool\x18\x01 \x01(\x0b2\x17.substrait.Type.BooleanH\x00R\x04bool\x12$\n\x02i8\x18\x02 \x01(\x0b2\x12.substrait.Type.I8H\x00R\x02i8\x12\'\n\x03i16\x18\x03 \x01(\x0b2\x13.substrait.Type.I16H\x00R\x03i16\x12\'\n\x03i32\x18\x05 \x01(\x0b2\x13.substrait.Type.I32H\x00R\x03i32\x12\'\n\x03i64\x18\x07 \x01(\x0b2\x13.substrait.Type.I64H\x00R\x03i64\x12*\n\x04fp32\x18\n \x01(\x0b2\x14.substrait.Type.FP32H\x00R\x04fp32\x12*\n\x04fp64\x18\x0b \x01(\x0b2\x14.substrait.Type.FP64H\x00R\x04fp64\x120\n\x06string\x18\x0c \x01(\x0b2\x16.substrait.Type.StringH\x00R\x06string\x120\n\x06binary\x18\r \x01(\x0b2\x16.substrait.Type.BinaryH\x00R\x06binary\x129\n\ttimestamp\x18\x0e \x01(\x0b2\x19.substrait.Type.TimestampH\x00R\ttimestamp\x12*\n\x04date\x18\x10 \x01(\x0b2\x14.substrait.Type.DateH\x00R\x04date\x12*\n\x04time\x18\x11 \x01(\x0b2\x14.substrait.Type.TimeH\x00R\x04time\x12C\n\rinterval_year\x18\x13 \x01(\x0b2\x1c.substrait.Type.IntervalYearH\x00R\x0cintervalYear\x12@\n\x0cinterval_day\x18\x14 \x01(\x0b2\x1b.substrait.Type.IntervalDayH\x00R\x0bintervalDay\x12@\n\x0ctimestamp_tz\x18\x1d \x01(\x0b2\x1b.substrait.Type.TimestampTZH\x00R\x0btimestampTz\x12*\n\x04uuid\x18  \x01(\x0b2\x14.substrait.Type.UUIDH\x00R\x04uuid\x12T\n\nfixed_char\x18\x15 \x01(\x0b23.substrait.ParameterizedType.ParameterizedFixedCharH\x00R\tfixedChar\x12M\n\x07varchar\x18\x16 \x01(\x0b21.substrait.ParameterizedType.ParameterizedVarCharH\x00R\x07varchar\x12Z\n\x0cfixed_binary\x18\x17 \x01(\x0b25.substrait.ParameterizedType.ParameterizedFixedBinaryH\x00R\x0bfixedBinary\x12M\n\x07decimal\x18\x18 \x01(\x0b21.substrait.ParameterizedType.ParameterizedDecimalH\x00R\x07decimal\x12J\n\x06struct\x18\x19 \x01(\x0b20.substrait.ParameterizedType.ParameterizedStructH\x00R\x06struct\x12D\n\x04list\x18\x1b \x01(\x0b2..substrait.ParameterizedType.ParameterizedListH\x00R\x04list\x12A\n\x03map\x18\x1c \x01(\x0b2-.substrait.ParameterizedType.ParameterizedMapH\x00R\x03map\x12Z\n\x0cuser_defined\x18\x1e \x01(\x0b25.substrait.ParameterizedType.ParameterizedUserDefinedH\x00R\x0buserDefined\x126\n\x14user_defined_pointer\x18\x1f \x01(\rB\x02\x18\x01H\x00R\x12userDefinedPointer\x12S\n\x0etype_parameter\x18! \x01(\x0b2*.substrait.ParameterizedType.TypeParameterH\x00R\rtypeParameter\x1aY\n\rTypeParameter\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x124\n\x06bounds\x18\x02 \x03(\x0b2\x1c.substrait.ParameterizedTypeR\x06bounds\x1a\xe6\x01\n\x10IntegerParameter\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12`\n\x15range_start_inclusive\x18\x02 \x01(\x0b2,.substrait.ParameterizedType.NullableIntegerR\x13rangeStartInclusive\x12\\\n\x13range_end_exclusive\x18\x03 \x01(\x0b2,.substrait.ParameterizedType.NullableIntegerR\x11rangeEndExclusive\x1a\'\n\x0fNullableInteger\x12\x14\n\x05value\x18\x01 \x01(\x03R\x05value\x1a\xc8\x01\n\x16ParameterizedFixedChar\x12B\n\x06length\x18\x01 \x01(\x0b2*.substrait.ParameterizedType.IntegerOptionR\x06length\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\xc6\x01\n\x14ParameterizedVarChar\x12B\n\x06length\x18\x01 \x01(\x0b2*.substrait.ParameterizedType.IntegerOptionR\x06length\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\xca\x01\n\x18ParameterizedFixedBinary\x12B\n\x06length\x18\x01 \x01(\x0b2*.substrait.ParameterizedType.IntegerOptionR\x06length\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\x8e\x02\n\x14ParameterizedDecimal\x12@\n\x05scale\x18\x01 \x01(\x0b2*.substrait.ParameterizedType.IntegerOptionR\x05scale\x12H\n\tprecision\x18\x02 \x01(\x0b2*.substrait.ParameterizedType.IntegerOptionR\tprecision\x12+\n\x11variation_pointer\x18\x03 \x01(\rR\x10variationPointer\x12=\n\x0bnullability\x18\x04 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\xb5\x01\n\x13ParameterizedStruct\x122\n\x05types\x18\x01 \x03(\x0b2\x1c.substrait.ParameterizedTypeR\x05types\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1az\n\x18ParameterizedNamedStruct\x12\x14\n\x05names\x18\x01 \x03(\tR\x05names\x12H\n\x06struct\x18\x02 \x01(\x0b20.substrait.ParameterizedType.ParameterizedStructR\x06struct\x1a\xb1\x01\n\x11ParameterizedList\x120\n\x04type\x18\x01 \x01(\x0b2\x1c.substrait.ParameterizedTypeR\x04type\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\xe2\x01\n\x10ParameterizedMap\x12.\n\x03key\x18\x01 \x01(\x0b2\x1c.substrait.ParameterizedTypeR\x03key\x122\n\x05value\x18\x02 \x01(\x0b2\x1c.substrait.ParameterizedTypeR\x05value\x12+\n\x11variation_pointer\x18\x03 \x01(\rR\x10variationPointer\x12=\n\x0bnullability\x18\x04 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\xa9\x01\n\x18ParameterizedUserDefined\x12!\n\x0ctype_pointer\x18\x01 \x01(\rR\x0btypePointer\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\x8a\x01\n\rIntegerOption\x12\x1a\n\x07literal\x18\x01 \x01(\x05H\x00R\x07literal\x12M\n\tparameter\x18\x02 \x01(\x0b2-.substrait.ParameterizedType.IntegerParameterH\x00R\tparameterB\x0e\n\x0cinteger_typeB\x06\n\x04kindBW\n\x12io.substrait.protoP\x01Z*github.com/substrait-io/substrait-go/proto\xaa\x02\x12Substrait.Protobufb\x06proto3')
-_PARAMETERIZEDTYPE = DESCRIPTOR.message_types_by_name['ParameterizedType']
-_PARAMETERIZEDTYPE_TYPEPARAMETER = _PARAMETERIZEDTYPE.nested_types_by_name['TypeParameter']
-_PARAMETERIZEDTYPE_INTEGERPARAMETER = _PARAMETERIZEDTYPE.nested_types_by_name['IntegerParameter']
-_PARAMETERIZEDTYPE_NULLABLEINTEGER = _PARAMETERIZEDTYPE.nested_types_by_name['NullableInteger']
-_PARAMETERIZEDTYPE_PARAMETERIZEDFIXEDCHAR = _PARAMETERIZEDTYPE.nested_types_by_name['ParameterizedFixedChar']
-_PARAMETERIZEDTYPE_PARAMETERIZEDVARCHAR = _PARAMETERIZEDTYPE.nested_types_by_name['ParameterizedVarChar']
-_PARAMETERIZEDTYPE_PARAMETERIZEDFIXEDBINARY = _PARAMETERIZEDTYPE.nested_types_by_name['ParameterizedFixedBinary']
-_PARAMETERIZEDTYPE_PARAMETERIZEDDECIMAL = _PARAMETERIZEDTYPE.nested_types_by_name['ParameterizedDecimal']
-_PARAMETERIZEDTYPE_PARAMETERIZEDSTRUCT = _PARAMETERIZEDTYPE.nested_types_by_name['ParameterizedStruct']
-_PARAMETERIZEDTYPE_PARAMETERIZEDNAMEDSTRUCT = _PARAMETERIZEDTYPE.nested_types_by_name['ParameterizedNamedStruct']
-_PARAMETERIZEDTYPE_PARAMETERIZEDLIST = _PARAMETERIZEDTYPE.nested_types_by_name['ParameterizedList']
-_PARAMETERIZEDTYPE_PARAMETERIZEDMAP = _PARAMETERIZEDTYPE.nested_types_by_name['ParameterizedMap']
-_PARAMETERIZEDTYPE_PARAMETERIZEDUSERDEFINED = _PARAMETERIZEDTYPE.nested_types_by_name['ParameterizedUserDefined']
-_PARAMETERIZEDTYPE_INTEGEROPTION = _PARAMETERIZEDTYPE.nested_types_by_name['IntegerOption']
-ParameterizedType = _reflection.GeneratedProtocolMessageType('ParameterizedType', (_message.Message,), {'TypeParameter': _reflection.GeneratedProtocolMessageType('TypeParameter', (_message.Message,), {'DESCRIPTOR': _PARAMETERIZEDTYPE_TYPEPARAMETER, '__module__': 'substrait.parameterized_types_pb2'}), 'IntegerParameter': _reflection.GeneratedProtocolMessageType('IntegerParameter', (_message.Message,), {'DESCRIPTOR': _PARAMETERIZEDTYPE_INTEGERPARAMETER, '__module__': 'substrait.parameterized_types_pb2'}), 'NullableInteger': _reflection.GeneratedProtocolMessageType('NullableInteger', (_message.Message,), {'DESCRIPTOR': _PARAMETERIZEDTYPE_NULLABLEINTEGER, '__module__': 'substrait.parameterized_types_pb2'}), 'ParameterizedFixedChar': _reflection.GeneratedProtocolMessageType('ParameterizedFixedChar', (_message.Message,), {'DESCRIPTOR': _PARAMETERIZEDTYPE_PARAMETERIZEDFIXEDCHAR, '__module__': 'substrait.parameterized_types_pb2'}), 'ParameterizedVarChar': _reflection.GeneratedProtocolMessageType('ParameterizedVarChar', (_message.Message,), {'DESCRIPTOR': _PARAMETERIZEDTYPE_PARAMETERIZEDVARCHAR, '__module__': 'substrait.parameterized_types_pb2'}), 'ParameterizedFixedBinary': _reflection.GeneratedProtocolMessageType('ParameterizedFixedBinary', (_message.Message,), {'DESCRIPTOR': _PARAMETERIZEDTYPE_PARAMETERIZEDFIXEDBINARY, '__module__': 'substrait.parameterized_types_pb2'}), 'ParameterizedDecimal': _reflection.GeneratedProtocolMessageType('ParameterizedDecimal', (_message.Message,), {'DESCRIPTOR': _PARAMETERIZEDTYPE_PARAMETERIZEDDECIMAL, '__module__': 'substrait.parameterized_types_pb2'}), 'ParameterizedStruct': _reflection.GeneratedProtocolMessageType('ParameterizedStruct', (_message.Message,), {'DESCRIPTOR': _PARAMETERIZEDTYPE_PARAMETERIZEDSTRUCT, '__module__': 'substrait.parameterized_types_pb2'}), 'ParameterizedNamedStruct': _reflection.GeneratedProtocolMessageType('ParameterizedNamedStruct', (_message.Message,), {'DESCRIPTOR': _PARAMETERIZEDTYPE_PARAMETERIZEDNAMEDSTRUCT, '__module__': 'substrait.parameterized_types_pb2'}), 'ParameterizedList': _reflection.GeneratedProtocolMessageType('ParameterizedList', (_message.Message,), {'DESCRIPTOR': _PARAMETERIZEDTYPE_PARAMETERIZEDLIST, '__module__': 'substrait.parameterized_types_pb2'}), 'ParameterizedMap': _reflection.GeneratedProtocolMessageType('ParameterizedMap', (_message.Message,), {'DESCRIPTOR': _PARAMETERIZEDTYPE_PARAMETERIZEDMAP, '__module__': 'substrait.parameterized_types_pb2'}), 'ParameterizedUserDefined': _reflection.GeneratedProtocolMessageType('ParameterizedUserDefined', (_message.Message,), {'DESCRIPTOR': _PARAMETERIZEDTYPE_PARAMETERIZEDUSERDEFINED, '__module__': 'substrait.parameterized_types_pb2'}), 'IntegerOption': _reflection.GeneratedProtocolMessageType('IntegerOption', (_message.Message,), {'DESCRIPTOR': _PARAMETERIZEDTYPE_INTEGEROPTION, '__module__': 'substrait.parameterized_types_pb2'}), 'DESCRIPTOR': _PARAMETERIZEDTYPE, '__module__': 'substrait.parameterized_types_pb2'})
-_sym_db.RegisterMessage(ParameterizedType)
-_sym_db.RegisterMessage(ParameterizedType.TypeParameter)
-_sym_db.RegisterMessage(ParameterizedType.IntegerParameter)
-_sym_db.RegisterMessage(ParameterizedType.NullableInteger)
-_sym_db.RegisterMessage(ParameterizedType.ParameterizedFixedChar)
-_sym_db.RegisterMessage(ParameterizedType.ParameterizedVarChar)
-_sym_db.RegisterMessage(ParameterizedType.ParameterizedFixedBinary)
-_sym_db.RegisterMessage(ParameterizedType.ParameterizedDecimal)
-_sym_db.RegisterMessage(ParameterizedType.ParameterizedStruct)
-_sym_db.RegisterMessage(ParameterizedType.ParameterizedNamedStruct)
-_sym_db.RegisterMessage(ParameterizedType.ParameterizedList)
-_sym_db.RegisterMessage(ParameterizedType.ParameterizedMap)
-_sym_db.RegisterMessage(ParameterizedType.ParameterizedUserDefined)
-_sym_db.RegisterMessage(ParameterizedType.IntegerOption)
-if _descriptor._USE_C_DESCRIPTORS == False:
-    DESCRIPTOR._options = None
-    DESCRIPTOR._serialized_options = b'\n\x12io.substrait.protoP\x01Z*github.com/substrait-io/substrait-go/proto\xaa\x02\x12Substrait.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 = 73
-    _PARAMETERIZEDTYPE._serialized_end = 3947
-    _PARAMETERIZEDTYPE_TYPEPARAMETER._serialized_start = 1664
-    _PARAMETERIZEDTYPE_TYPEPARAMETER._serialized_end = 1753
-    _PARAMETERIZEDTYPE_INTEGERPARAMETER._serialized_start = 1756
-    _PARAMETERIZEDTYPE_INTEGERPARAMETER._serialized_end = 1986
-    _PARAMETERIZEDTYPE_NULLABLEINTEGER._serialized_start = 1988
-    _PARAMETERIZEDTYPE_NULLABLEINTEGER._serialized_end = 2027
-    _PARAMETERIZEDTYPE_PARAMETERIZEDFIXEDCHAR._serialized_start = 2030
-    _PARAMETERIZEDTYPE_PARAMETERIZEDFIXEDCHAR._serialized_end = 2230
-    _PARAMETERIZEDTYPE_PARAMETERIZEDVARCHAR._serialized_start = 2233
-    _PARAMETERIZEDTYPE_PARAMETERIZEDVARCHAR._serialized_end = 2431
-    _PARAMETERIZEDTYPE_PARAMETERIZEDFIXEDBINARY._serialized_start = 2434
-    _PARAMETERIZEDTYPE_PARAMETERIZEDFIXEDBINARY._serialized_end = 2636
-    _PARAMETERIZEDTYPE_PARAMETERIZEDDECIMAL._serialized_start = 2639
-    _PARAMETERIZEDTYPE_PARAMETERIZEDDECIMAL._serialized_end = 2909
-    _PARAMETERIZEDTYPE_PARAMETERIZEDSTRUCT._serialized_start = 2912
-    _PARAMETERIZEDTYPE_PARAMETERIZEDSTRUCT._serialized_end = 3093
-    _PARAMETERIZEDTYPE_PARAMETERIZEDNAMEDSTRUCT._serialized_start = 3095
-    _PARAMETERIZEDTYPE_PARAMETERIZEDNAMEDSTRUCT._serialized_end = 3217
-    _PARAMETERIZEDTYPE_PARAMETERIZEDLIST._serialized_start = 3220
-    _PARAMETERIZEDTYPE_PARAMETERIZEDLIST._serialized_end = 3397
-    _PARAMETERIZEDTYPE_PARAMETERIZEDMAP._serialized_start = 3400
-    _PARAMETERIZEDTYPE_PARAMETERIZEDMAP._serialized_end = 3626
-    _PARAMETERIZEDTYPE_PARAMETERIZEDUSERDEFINED._serialized_start = 3629
-    _PARAMETERIZEDTYPE_PARAMETERIZEDUSERDEFINED._serialized_end = 3798
-    _PARAMETERIZEDTYPE_INTEGEROPTION._serialized_start = 3801
-    _PARAMETERIZEDTYPE_INTEGEROPTION._serialized_end = 3939
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/plan_pb2.py b/ibis_substrait/proto/substrait/plan_pb2.py
deleted file mode 100644
index 479546d2..00000000
--- a/ibis_substrait/proto/substrait/plan_pb2.py
+++ /dev/null
@@ -1,23 +0,0 @@
-"""Generated protocol buffer code."""
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-from google.protobuf import symbol_database as _symbol_database
-_sym_db = _symbol_database.Default()
-from ..substrait import algebra_pb2 as substrait_dot_algebra__pb2
-from ..substrait.extensions import extensions_pb2 as substrait_dot_extensions_dot_extensions__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14substrait/plan.proto\x12\tsubstrait\x1a\x17substrait/algebra.proto\x1a%substrait/extensions/extensions.proto"c\n\x07PlanRel\x12"\n\x03rel\x18\x01 \x01(\x0b2\x0e.substrait.RelH\x00R\x03rel\x12(\n\x04root\x18\x02 \x01(\x0b2\x12.substrait.RelRootH\x00R\x04rootB\n\n\x08rel_type"\xe3\x02\n\x04Plan\x12O\n\x0eextension_uris\x18\x01 \x03(\x0b2(.substrait.extensions.SimpleExtensionURIR\rextensionUris\x12P\n\nextensions\x18\x02 \x03(\x0b20.substrait.extensions.SimpleExtensionDeclarationR\nextensions\x120\n\trelations\x18\x03 \x03(\x0b2\x12.substrait.PlanRelR\trelations\x12X\n\x13advanced_extensions\x18\x04 \x01(\x0b2\'.substrait.extensions.AdvancedExtensionR\x12advancedExtensions\x12,\n\x12expected_type_urls\x18\x05 \x03(\tR\x10expectedTypeUrlsBW\n\x12io.substrait.protoP\x01Z*github.com/substrait-io/substrait-go/proto\xaa\x02\x12Substrait.Protobufb\x06proto3')
-_PLANREL = DESCRIPTOR.message_types_by_name['PlanRel']
-_PLAN = DESCRIPTOR.message_types_by_name['Plan']
-PlanRel = _reflection.GeneratedProtocolMessageType('PlanRel', (_message.Message,), {'DESCRIPTOR': _PLANREL, '__module__': 'substrait.plan_pb2'})
-_sym_db.RegisterMessage(PlanRel)
-Plan = _reflection.GeneratedProtocolMessageType('Plan', (_message.Message,), {'DESCRIPTOR': _PLAN, '__module__': 'substrait.plan_pb2'})
-_sym_db.RegisterMessage(Plan)
-if _descriptor._USE_C_DESCRIPTORS == False:
-    DESCRIPTOR._options = None
-    DESCRIPTOR._serialized_options = b'\n\x12io.substrait.protoP\x01Z*github.com/substrait-io/substrait-go/proto\xaa\x02\x12Substrait.Protobuf'
-    _PLANREL._serialized_start = 99
-    _PLANREL._serialized_end = 198
-    _PLAN._serialized_start = 201
-    _PLAN._serialized_end = 556
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/type_expressions_pb2.py b/ibis_substrait/proto/substrait/type_expressions_pb2.py
deleted file mode 100644
index 9cf8116d..00000000
--- a/ibis_substrait/proto/substrait/type_expressions_pb2.py
+++ /dev/null
@@ -1,81 +0,0 @@
-"""Generated protocol buffer code."""
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-from google.protobuf import symbol_database as _symbol_database
-_sym_db = _symbol_database.Default()
-from ..substrait import type_pb2 as substrait_dot_type__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n substrait/type_expressions.proto\x12\tsubstrait\x1a\x14substrait/type.proto"\xcc&\n\x14DerivationExpression\x12-\n\x04bool\x18\x01 \x01(\x0b2\x17.substrait.Type.BooleanH\x00R\x04bool\x12$\n\x02i8\x18\x02 \x01(\x0b2\x12.substrait.Type.I8H\x00R\x02i8\x12\'\n\x03i16\x18\x03 \x01(\x0b2\x13.substrait.Type.I16H\x00R\x03i16\x12\'\n\x03i32\x18\x05 \x01(\x0b2\x13.substrait.Type.I32H\x00R\x03i32\x12\'\n\x03i64\x18\x07 \x01(\x0b2\x13.substrait.Type.I64H\x00R\x03i64\x12*\n\x04fp32\x18\n \x01(\x0b2\x14.substrait.Type.FP32H\x00R\x04fp32\x12*\n\x04fp64\x18\x0b \x01(\x0b2\x14.substrait.Type.FP64H\x00R\x04fp64\x120\n\x06string\x18\x0c \x01(\x0b2\x16.substrait.Type.StringH\x00R\x06string\x120\n\x06binary\x18\r \x01(\x0b2\x16.substrait.Type.BinaryH\x00R\x06binary\x129\n\ttimestamp\x18\x0e \x01(\x0b2\x19.substrait.Type.TimestampH\x00R\ttimestamp\x12*\n\x04date\x18\x10 \x01(\x0b2\x14.substrait.Type.DateH\x00R\x04date\x12*\n\x04time\x18\x11 \x01(\x0b2\x14.substrait.Type.TimeH\x00R\x04time\x12C\n\rinterval_year\x18\x13 \x01(\x0b2\x1c.substrait.Type.IntervalYearH\x00R\x0cintervalYear\x12@\n\x0cinterval_day\x18\x14 \x01(\x0b2\x1b.substrait.Type.IntervalDayH\x00R\x0bintervalDay\x12@\n\x0ctimestamp_tz\x18\x1d \x01(\x0b2\x1b.substrait.Type.TimestampTZH\x00R\x0btimestampTz\x12*\n\x04uuid\x18  \x01(\x0b2\x14.substrait.Type.UUIDH\x00R\x04uuid\x12T\n\nfixed_char\x18\x15 \x01(\x0b23.substrait.DerivationExpression.ExpressionFixedCharH\x00R\tfixedChar\x12M\n\x07varchar\x18\x16 \x01(\x0b21.substrait.DerivationExpression.ExpressionVarCharH\x00R\x07varchar\x12Z\n\x0cfixed_binary\x18\x17 \x01(\x0b25.substrait.DerivationExpression.ExpressionFixedBinaryH\x00R\x0bfixedBinary\x12M\n\x07decimal\x18\x18 \x01(\x0b21.substrait.DerivationExpression.ExpressionDecimalH\x00R\x07decimal\x12J\n\x06struct\x18\x19 \x01(\x0b20.substrait.DerivationExpression.ExpressionStructH\x00R\x06struct\x12D\n\x04list\x18\x1b \x01(\x0b2..substrait.DerivationExpression.ExpressionListH\x00R\x04list\x12A\n\x03map\x18\x1c \x01(\x0b2-.substrait.DerivationExpression.ExpressionMapH\x00R\x03map\x12Z\n\x0cuser_defined\x18\x1e \x01(\x0b25.substrait.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\x12D\n\x08unary_op\x18$ \x01(\x0b2\'.substrait.DerivationExpression.UnaryOpH\x00R\x07unaryOp\x12G\n\tbinary_op\x18% \x01(\x0b2(.substrait.DerivationExpression.BinaryOpH\x00R\x08binaryOp\x12A\n\x07if_else\x18& \x01(\x0b2&.substrait.DerivationExpression.IfElseH\x00R\x06ifElse\x12V\n\x0ereturn_program\x18\' \x01(\x0b2-.substrait.DerivationExpression.ReturnProgramH\x00R\rreturnProgram\x1a\xba\x01\n\x13ExpressionFixedChar\x127\n\x06length\x18\x01 \x01(\x0b2\x1f.substrait.DerivationExpressionR\x06length\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\xb8\x01\n\x11ExpressionVarChar\x127\n\x06length\x18\x01 \x01(\x0b2\x1f.substrait.DerivationExpressionR\x06length\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\xbc\x01\n\x15ExpressionFixedBinary\x127\n\x06length\x18\x01 \x01(\x0b2\x1f.substrait.DerivationExpressionR\x06length\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\xf5\x01\n\x11ExpressionDecimal\x125\n\x05scale\x18\x01 \x01(\x0b2\x1f.substrait.DerivationExpressionR\x05scale\x12=\n\tprecision\x18\x02 \x01(\x0b2\x1f.substrait.DerivationExpressionR\tprecision\x12+\n\x11variation_pointer\x18\x03 \x01(\rR\x10variationPointer\x12=\n\x0bnullability\x18\x04 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\xb5\x01\n\x10ExpressionStruct\x125\n\x05types\x18\x01 \x03(\x0b2\x1f.substrait.DerivationExpressionR\x05types\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1aw\n\x15ExpressionNamedStruct\x12\x14\n\x05names\x18\x01 \x03(\tR\x05names\x12H\n\x06struct\x18\x02 \x01(\x0b20.substrait.DerivationExpression.ExpressionStructR\x06struct\x1a\xb1\x01\n\x0eExpressionList\x123\n\x04type\x18\x01 \x01(\x0b2\x1f.substrait.DerivationExpressionR\x04type\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\xe5\x01\n\rExpressionMap\x121\n\x03key\x18\x01 \x01(\x0b2\x1f.substrait.DerivationExpressionR\x03key\x125\n\x05value\x18\x02 \x01(\x0b2\x1f.substrait.DerivationExpressionR\x05value\x12+\n\x11variation_pointer\x18\x03 \x01(\rR\x10variationPointer\x12=\n\x0bnullability\x18\x04 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\xa6\x01\n\x15ExpressionUserDefined\x12!\n\x0ctype_pointer\x18\x01 \x01(\rR\x0btypePointer\x12+\n\x11variation_pointer\x18\x02 \x01(\rR\x10variationPointer\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\xcc\x01\n\x06IfElse\x12B\n\x0cif_condition\x18\x01 \x01(\x0b2\x1f.substrait.DerivationExpressionR\x0bifCondition\x12<\n\tif_return\x18\x02 \x01(\x0b2\x1f.substrait.DerivationExpressionR\x08ifReturn\x12@\n\x0belse_return\x18\x03 \x01(\x0b2\x1f.substrait.DerivationExpressionR\nelseReturn\x1a\xd7\x01\n\x07UnaryOp\x12L\n\x07op_type\x18\x01 \x01(\x0e23.substrait.DerivationExpression.UnaryOp.UnaryOpTypeR\x06opType\x121\n\x03arg\x18\x02 \x01(\x0b2\x1f.substrait.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\xb4\x04\n\x08BinaryOp\x12N\n\x07op_type\x18\x01 \x01(\x0e25.substrait.DerivationExpression.BinaryOp.BinaryOpTypeR\x06opType\x123\n\x04arg1\x18\x02 \x01(\x0b2\x1f.substrait.DerivationExpressionR\x04arg1\x123\n\x04arg2\x18\x03 \x01(\x0b2\x1f.substrait.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\x9a\x02\n\rReturnProgram\x12Z\n\x0bassignments\x18\x01 \x03(\x0b28.substrait.DerivationExpression.ReturnProgram.AssignmentR\x0bassignments\x12J\n\x10final_expression\x18\x02 \x01(\x0b2\x1f.substrait.DerivationExpressionR\x0ffinalExpression\x1aa\n\nAssignment\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12?\n\nexpression\x18\x02 \x01(\x0b2\x1f.substrait.DerivationExpressionR\nexpressionB\x06\n\x04kindBW\n\x12io.substrait.protoP\x01Z*github.com/substrait-io/substrait-go/proto\xaa\x02\x12Substrait.Protobufb\x06proto3')
-_DERIVATIONEXPRESSION = DESCRIPTOR.message_types_by_name['DerivationExpression']
-_DERIVATIONEXPRESSION_EXPRESSIONFIXEDCHAR = _DERIVATIONEXPRESSION.nested_types_by_name['ExpressionFixedChar']
-_DERIVATIONEXPRESSION_EXPRESSIONVARCHAR = _DERIVATIONEXPRESSION.nested_types_by_name['ExpressionVarChar']
-_DERIVATIONEXPRESSION_EXPRESSIONFIXEDBINARY = _DERIVATIONEXPRESSION.nested_types_by_name['ExpressionFixedBinary']
-_DERIVATIONEXPRESSION_EXPRESSIONDECIMAL = _DERIVATIONEXPRESSION.nested_types_by_name['ExpressionDecimal']
-_DERIVATIONEXPRESSION_EXPRESSIONSTRUCT = _DERIVATIONEXPRESSION.nested_types_by_name['ExpressionStruct']
-_DERIVATIONEXPRESSION_EXPRESSIONNAMEDSTRUCT = _DERIVATIONEXPRESSION.nested_types_by_name['ExpressionNamedStruct']
-_DERIVATIONEXPRESSION_EXPRESSIONLIST = _DERIVATIONEXPRESSION.nested_types_by_name['ExpressionList']
-_DERIVATIONEXPRESSION_EXPRESSIONMAP = _DERIVATIONEXPRESSION.nested_types_by_name['ExpressionMap']
-_DERIVATIONEXPRESSION_EXPRESSIONUSERDEFINED = _DERIVATIONEXPRESSION.nested_types_by_name['ExpressionUserDefined']
-_DERIVATIONEXPRESSION_IFELSE = _DERIVATIONEXPRESSION.nested_types_by_name['IfElse']
-_DERIVATIONEXPRESSION_UNARYOP = _DERIVATIONEXPRESSION.nested_types_by_name['UnaryOp']
-_DERIVATIONEXPRESSION_BINARYOP = _DERIVATIONEXPRESSION.nested_types_by_name['BinaryOp']
-_DERIVATIONEXPRESSION_RETURNPROGRAM = _DERIVATIONEXPRESSION.nested_types_by_name['ReturnProgram']
-_DERIVATIONEXPRESSION_RETURNPROGRAM_ASSIGNMENT = _DERIVATIONEXPRESSION_RETURNPROGRAM.nested_types_by_name['Assignment']
-_DERIVATIONEXPRESSION_UNARYOP_UNARYOPTYPE = _DERIVATIONEXPRESSION_UNARYOP.enum_types_by_name['UnaryOpType']
-_DERIVATIONEXPRESSION_BINARYOP_BINARYOPTYPE = _DERIVATIONEXPRESSION_BINARYOP.enum_types_by_name['BinaryOpType']
-DerivationExpression = _reflection.GeneratedProtocolMessageType('DerivationExpression', (_message.Message,), {'ExpressionFixedChar': _reflection.GeneratedProtocolMessageType('ExpressionFixedChar', (_message.Message,), {'DESCRIPTOR': _DERIVATIONEXPRESSION_EXPRESSIONFIXEDCHAR, '__module__': 'substrait.type_expressions_pb2'}), 'ExpressionVarChar': _reflection.GeneratedProtocolMessageType('ExpressionVarChar', (_message.Message,), {'DESCRIPTOR': _DERIVATIONEXPRESSION_EXPRESSIONVARCHAR, '__module__': 'substrait.type_expressions_pb2'}), 'ExpressionFixedBinary': _reflection.GeneratedProtocolMessageType('ExpressionFixedBinary', (_message.Message,), {'DESCRIPTOR': _DERIVATIONEXPRESSION_EXPRESSIONFIXEDBINARY, '__module__': 'substrait.type_expressions_pb2'}), 'ExpressionDecimal': _reflection.GeneratedProtocolMessageType('ExpressionDecimal', (_message.Message,), {'DESCRIPTOR': _DERIVATIONEXPRESSION_EXPRESSIONDECIMAL, '__module__': 'substrait.type_expressions_pb2'}), 'ExpressionStruct': _reflection.GeneratedProtocolMessageType('ExpressionStruct', (_message.Message,), {'DESCRIPTOR': _DERIVATIONEXPRESSION_EXPRESSIONSTRUCT, '__module__': 'substrait.type_expressions_pb2'}), 'ExpressionNamedStruct': _reflection.GeneratedProtocolMessageType('ExpressionNamedStruct', (_message.Message,), {'DESCRIPTOR': _DERIVATIONEXPRESSION_EXPRESSIONNAMEDSTRUCT, '__module__': 'substrait.type_expressions_pb2'}), 'ExpressionList': _reflection.GeneratedProtocolMessageType('ExpressionList', (_message.Message,), {'DESCRIPTOR': _DERIVATIONEXPRESSION_EXPRESSIONLIST, '__module__': 'substrait.type_expressions_pb2'}), 'ExpressionMap': _reflection.GeneratedProtocolMessageType('ExpressionMap', (_message.Message,), {'DESCRIPTOR': _DERIVATIONEXPRESSION_EXPRESSIONMAP, '__module__': 'substrait.type_expressions_pb2'}), 'ExpressionUserDefined': _reflection.GeneratedProtocolMessageType('ExpressionUserDefined', (_message.Message,), {'DESCRIPTOR': _DERIVATIONEXPRESSION_EXPRESSIONUSERDEFINED, '__module__': 'substrait.type_expressions_pb2'}), 'IfElse': _reflection.GeneratedProtocolMessageType('IfElse', (_message.Message,), {'DESCRIPTOR': _DERIVATIONEXPRESSION_IFELSE, '__module__': 'substrait.type_expressions_pb2'}), 'UnaryOp': _reflection.GeneratedProtocolMessageType('UnaryOp', (_message.Message,), {'DESCRIPTOR': _DERIVATIONEXPRESSION_UNARYOP, '__module__': 'substrait.type_expressions_pb2'}), 'BinaryOp': _reflection.GeneratedProtocolMessageType('BinaryOp', (_message.Message,), {'DESCRIPTOR': _DERIVATIONEXPRESSION_BINARYOP, '__module__': 'substrait.type_expressions_pb2'}), 'ReturnProgram': _reflection.GeneratedProtocolMessageType('ReturnProgram', (_message.Message,), {'Assignment': _reflection.GeneratedProtocolMessageType('Assignment', (_message.Message,), {'DESCRIPTOR': _DERIVATIONEXPRESSION_RETURNPROGRAM_ASSIGNMENT, '__module__': 'substrait.type_expressions_pb2'}), 'DESCRIPTOR': _DERIVATIONEXPRESSION_RETURNPROGRAM, '__module__': 'substrait.type_expressions_pb2'}), 'DESCRIPTOR': _DERIVATIONEXPRESSION, '__module__': 'substrait.type_expressions_pb2'})
-_sym_db.RegisterMessage(DerivationExpression)
-_sym_db.RegisterMessage(DerivationExpression.ExpressionFixedChar)
-_sym_db.RegisterMessage(DerivationExpression.ExpressionVarChar)
-_sym_db.RegisterMessage(DerivationExpression.ExpressionFixedBinary)
-_sym_db.RegisterMessage(DerivationExpression.ExpressionDecimal)
-_sym_db.RegisterMessage(DerivationExpression.ExpressionStruct)
-_sym_db.RegisterMessage(DerivationExpression.ExpressionNamedStruct)
-_sym_db.RegisterMessage(DerivationExpression.ExpressionList)
-_sym_db.RegisterMessage(DerivationExpression.ExpressionMap)
-_sym_db.RegisterMessage(DerivationExpression.ExpressionUserDefined)
-_sym_db.RegisterMessage(DerivationExpression.IfElse)
-_sym_db.RegisterMessage(DerivationExpression.UnaryOp)
-_sym_db.RegisterMessage(DerivationExpression.BinaryOp)
-_sym_db.RegisterMessage(DerivationExpression.ReturnProgram)
-_sym_db.RegisterMessage(DerivationExpression.ReturnProgram.Assignment)
-if _descriptor._USE_C_DESCRIPTORS == False:
-    DESCRIPTOR._options = None
-    DESCRIPTOR._serialized_options = b'\n\x12io.substrait.protoP\x01Z*github.com/substrait-io/substrait-go/proto\xaa\x02\x12Substrait.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 = 70
-    _DERIVATIONEXPRESSION._serialized_end = 5010
-    _DERIVATIONEXPRESSION_EXPRESSIONFIXEDCHAR._serialized_start = 2027
-    _DERIVATIONEXPRESSION_EXPRESSIONFIXEDCHAR._serialized_end = 2213
-    _DERIVATIONEXPRESSION_EXPRESSIONVARCHAR._serialized_start = 2216
-    _DERIVATIONEXPRESSION_EXPRESSIONVARCHAR._serialized_end = 2400
-    _DERIVATIONEXPRESSION_EXPRESSIONFIXEDBINARY._serialized_start = 2403
-    _DERIVATIONEXPRESSION_EXPRESSIONFIXEDBINARY._serialized_end = 2591
-    _DERIVATIONEXPRESSION_EXPRESSIONDECIMAL._serialized_start = 2594
-    _DERIVATIONEXPRESSION_EXPRESSIONDECIMAL._serialized_end = 2839
-    _DERIVATIONEXPRESSION_EXPRESSIONSTRUCT._serialized_start = 2842
-    _DERIVATIONEXPRESSION_EXPRESSIONSTRUCT._serialized_end = 3023
-    _DERIVATIONEXPRESSION_EXPRESSIONNAMEDSTRUCT._serialized_start = 3025
-    _DERIVATIONEXPRESSION_EXPRESSIONNAMEDSTRUCT._serialized_end = 3144
-    _DERIVATIONEXPRESSION_EXPRESSIONLIST._serialized_start = 3147
-    _DERIVATIONEXPRESSION_EXPRESSIONLIST._serialized_end = 3324
-    _DERIVATIONEXPRESSION_EXPRESSIONMAP._serialized_start = 3327
-    _DERIVATIONEXPRESSION_EXPRESSIONMAP._serialized_end = 3556
-    _DERIVATIONEXPRESSION_EXPRESSIONUSERDEFINED._serialized_start = 3559
-    _DERIVATIONEXPRESSION_EXPRESSIONUSERDEFINED._serialized_end = 3725
-    _DERIVATIONEXPRESSION_IFELSE._serialized_start = 3728
-    _DERIVATIONEXPRESSION_IFELSE._serialized_end = 3932
-    _DERIVATIONEXPRESSION_UNARYOP._serialized_start = 3935
-    _DERIVATIONEXPRESSION_UNARYOP._serialized_end = 4150
-    _DERIVATIONEXPRESSION_UNARYOP_UNARYOPTYPE._serialized_start = 4075
-    _DERIVATIONEXPRESSION_UNARYOP_UNARYOPTYPE._serialized_end = 4150
-    _DERIVATIONEXPRESSION_BINARYOP._serialized_start = 4153
-    _DERIVATIONEXPRESSION_BINARYOP._serialized_end = 4717
-    _DERIVATIONEXPRESSION_BINARYOP_BINARYOPTYPE._serialized_start = 4352
-    _DERIVATIONEXPRESSION_BINARYOP_BINARYOPTYPE._serialized_end = 4717
-    _DERIVATIONEXPRESSION_RETURNPROGRAM._serialized_start = 4720
-    _DERIVATIONEXPRESSION_RETURNPROGRAM._serialized_end = 5002
-    _DERIVATIONEXPRESSION_RETURNPROGRAM_ASSIGNMENT._serialized_start = 4905
-    _DERIVATIONEXPRESSION_RETURNPROGRAM_ASSIGNMENT._serialized_end = 5002
\ No newline at end of file
diff --git a/ibis_substrait/proto/substrait/type_pb2.py b/ibis_substrait/proto/substrait/type_pb2.py
deleted file mode 100644
index 88a5b0da..00000000
--- a/ibis_substrait/proto/substrait/type_pb2.py
+++ /dev/null
@@ -1,127 +0,0 @@
-"""Generated protocol buffer code."""
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-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\x14substrait/type.proto\x12\tsubstrait\x1a\x1bgoogle/protobuf/empty.proto"\xb4(\n\x04Type\x12-\n\x04bool\x18\x01 \x01(\x0b2\x17.substrait.Type.BooleanH\x00R\x04bool\x12$\n\x02i8\x18\x02 \x01(\x0b2\x12.substrait.Type.I8H\x00R\x02i8\x12\'\n\x03i16\x18\x03 \x01(\x0b2\x13.substrait.Type.I16H\x00R\x03i16\x12\'\n\x03i32\x18\x05 \x01(\x0b2\x13.substrait.Type.I32H\x00R\x03i32\x12\'\n\x03i64\x18\x07 \x01(\x0b2\x13.substrait.Type.I64H\x00R\x03i64\x12*\n\x04fp32\x18\n \x01(\x0b2\x14.substrait.Type.FP32H\x00R\x04fp32\x12*\n\x04fp64\x18\x0b \x01(\x0b2\x14.substrait.Type.FP64H\x00R\x04fp64\x120\n\x06string\x18\x0c \x01(\x0b2\x16.substrait.Type.StringH\x00R\x06string\x120\n\x06binary\x18\r \x01(\x0b2\x16.substrait.Type.BinaryH\x00R\x06binary\x129\n\ttimestamp\x18\x0e \x01(\x0b2\x19.substrait.Type.TimestampH\x00R\ttimestamp\x12*\n\x04date\x18\x10 \x01(\x0b2\x14.substrait.Type.DateH\x00R\x04date\x12*\n\x04time\x18\x11 \x01(\x0b2\x14.substrait.Type.TimeH\x00R\x04time\x12C\n\rinterval_year\x18\x13 \x01(\x0b2\x1c.substrait.Type.IntervalYearH\x00R\x0cintervalYear\x12@\n\x0cinterval_day\x18\x14 \x01(\x0b2\x1b.substrait.Type.IntervalDayH\x00R\x0bintervalDay\x12@\n\x0ctimestamp_tz\x18\x1d \x01(\x0b2\x1b.substrait.Type.TimestampTZH\x00R\x0btimestampTz\x12*\n\x04uuid\x18  \x01(\x0b2\x14.substrait.Type.UUIDH\x00R\x04uuid\x12:\n\nfixed_char\x18\x15 \x01(\x0b2\x19.substrait.Type.FixedCharH\x00R\tfixedChar\x123\n\x07varchar\x18\x16 \x01(\x0b2\x17.substrait.Type.VarCharH\x00R\x07varchar\x12@\n\x0cfixed_binary\x18\x17 \x01(\x0b2\x1b.substrait.Type.FixedBinaryH\x00R\x0bfixedBinary\x123\n\x07decimal\x18\x18 \x01(\x0b2\x17.substrait.Type.DecimalH\x00R\x07decimal\x120\n\x06struct\x18\x19 \x01(\x0b2\x16.substrait.Type.StructH\x00R\x06struct\x12*\n\x04list\x18\x1b \x01(\x0b2\x14.substrait.Type.ListH\x00R\x04list\x12\'\n\x03map\x18\x1c \x01(\x0b2\x13.substrait.Type.MapH\x00R\x03map\x12@\n\x0cuser_defined\x18\x1e \x01(\x0b2\x1b.substrait.Type.UserDefinedH\x00R\x0buserDefined\x12C\n\x1buser_defined_type_reference\x18\x1f \x01(\rB\x02\x18\x01H\x00R\x18userDefinedTypeReference\x1a\x82\x01\n\x07Boolean\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x02 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a}\n\x02I8\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x02 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a~\n\x03I16\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x02 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a~\n\x03I32\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x02 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a~\n\x03I64\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x02 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\x7f\n\x04FP32\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x02 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\x7f\n\x04FP64\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x02 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\x81\x01\n\x06String\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x02 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\x81\x01\n\x06Binary\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x02 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\x84\x01\n\tTimestamp\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x02 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\x7f\n\x04Date\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x02 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\x7f\n\x04Time\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x02 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\x86\x01\n\x0bTimestampTZ\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x02 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\x87\x01\n\x0cIntervalYear\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x02 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\x86\x01\n\x0bIntervalDay\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x02 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\x7f\n\x04UUID\x128\n\x18type_variation_reference\x18\x01 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x02 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\x9c\x01\n\tFixedChar\x12\x16\n\x06length\x18\x01 \x01(\x05R\x06length\x128\n\x18type_variation_reference\x18\x02 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\x9a\x01\n\x07VarChar\x12\x16\n\x06length\x18\x01 \x01(\x05R\x06length\x128\n\x18type_variation_reference\x18\x02 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\x9e\x01\n\x0bFixedBinary\x12\x16\n\x06length\x18\x01 \x01(\x05R\x06length\x128\n\x18type_variation_reference\x18\x02 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\xb6\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\x12=\n\x0bnullability\x18\x04 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\xa8\x01\n\x06Struct\x12%\n\x05types\x18\x01 \x03(\x0b2\x0f.substrait.TypeR\x05types\x128\n\x18type_variation_reference\x18\x02 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\xa4\x01\n\x04List\x12#\n\x04type\x18\x01 \x01(\x0b2\x0f.substrait.TypeR\x04type\x128\n\x18type_variation_reference\x18\x02 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\xc8\x01\n\x03Map\x12!\n\x03key\x18\x01 \x01(\x0b2\x0f.substrait.TypeR\x03key\x12%\n\x05value\x18\x02 \x01(\x0b2\x0f.substrait.TypeR\x05value\x128\n\x18type_variation_reference\x18\x03 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x04 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x1a\xf1\x01\n\x0bUserDefined\x12%\n\x0etype_reference\x18\x01 \x01(\rR\rtypeReference\x128\n\x18type_variation_reference\x18\x02 \x01(\rR\x16typeVariationReference\x12=\n\x0bnullability\x18\x03 \x01(\x0e2\x1b.substrait.Type.NullabilityR\x0bnullability\x12B\n\x0ftype_parameters\x18\x04 \x03(\x0b2\x19.substrait.Type.ParameterR\x0etypeParameters\x1a\xde\x01\n\tParameter\x12,\n\x04null\x18\x01 \x01(\x0b2\x16.google.protobuf.EmptyH\x00R\x04null\x12.\n\tdata_type\x18\x02 \x01(\x0b2\x0f.substrait.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"S\n\x0bNamedStruct\x12\x14\n\x05names\x18\x01 \x03(\tR\x05names\x12.\n\x06struct\x18\x02 \x01(\x0b2\x16.substrait.Type.StructR\x06structBW\n\x12io.substrait.protoP\x01Z*github.com/substrait-io/substrait-go/proto\xaa\x02\x12Substrait.Protobufb\x06proto3')
-_TYPE = DESCRIPTOR.message_types_by_name['Type']
-_TYPE_BOOLEAN = _TYPE.nested_types_by_name['Boolean']
-_TYPE_I8 = _TYPE.nested_types_by_name['I8']
-_TYPE_I16 = _TYPE.nested_types_by_name['I16']
-_TYPE_I32 = _TYPE.nested_types_by_name['I32']
-_TYPE_I64 = _TYPE.nested_types_by_name['I64']
-_TYPE_FP32 = _TYPE.nested_types_by_name['FP32']
-_TYPE_FP64 = _TYPE.nested_types_by_name['FP64']
-_TYPE_STRING = _TYPE.nested_types_by_name['String']
-_TYPE_BINARY = _TYPE.nested_types_by_name['Binary']
-_TYPE_TIMESTAMP = _TYPE.nested_types_by_name['Timestamp']
-_TYPE_DATE = _TYPE.nested_types_by_name['Date']
-_TYPE_TIME = _TYPE.nested_types_by_name['Time']
-_TYPE_TIMESTAMPTZ = _TYPE.nested_types_by_name['TimestampTZ']
-_TYPE_INTERVALYEAR = _TYPE.nested_types_by_name['IntervalYear']
-_TYPE_INTERVALDAY = _TYPE.nested_types_by_name['IntervalDay']
-_TYPE_UUID = _TYPE.nested_types_by_name['UUID']
-_TYPE_FIXEDCHAR = _TYPE.nested_types_by_name['FixedChar']
-_TYPE_VARCHAR = _TYPE.nested_types_by_name['VarChar']
-_TYPE_FIXEDBINARY = _TYPE.nested_types_by_name['FixedBinary']
-_TYPE_DECIMAL = _TYPE.nested_types_by_name['Decimal']
-_TYPE_STRUCT = _TYPE.nested_types_by_name['Struct']
-_TYPE_LIST = _TYPE.nested_types_by_name['List']
-_TYPE_MAP = _TYPE.nested_types_by_name['Map']
-_TYPE_USERDEFINED = _TYPE.nested_types_by_name['UserDefined']
-_TYPE_PARAMETER = _TYPE.nested_types_by_name['Parameter']
-_NAMEDSTRUCT = DESCRIPTOR.message_types_by_name['NamedStruct']
-_TYPE_NULLABILITY = _TYPE.enum_types_by_name['Nullability']
-Type = _reflection.GeneratedProtocolMessageType('Type', (_message.Message,), {'Boolean': _reflection.GeneratedProtocolMessageType('Boolean', (_message.Message,), {'DESCRIPTOR': _TYPE_BOOLEAN, '__module__': 'substrait.type_pb2'}), 'I8': _reflection.GeneratedProtocolMessageType('I8', (_message.Message,), {'DESCRIPTOR': _TYPE_I8, '__module__': 'substrait.type_pb2'}), 'I16': _reflection.GeneratedProtocolMessageType('I16', (_message.Message,), {'DESCRIPTOR': _TYPE_I16, '__module__': 'substrait.type_pb2'}), 'I32': _reflection.GeneratedProtocolMessageType('I32', (_message.Message,), {'DESCRIPTOR': _TYPE_I32, '__module__': 'substrait.type_pb2'}), 'I64': _reflection.GeneratedProtocolMessageType('I64', (_message.Message,), {'DESCRIPTOR': _TYPE_I64, '__module__': 'substrait.type_pb2'}), 'FP32': _reflection.GeneratedProtocolMessageType('FP32', (_message.Message,), {'DESCRIPTOR': _TYPE_FP32, '__module__': 'substrait.type_pb2'}), 'FP64': _reflection.GeneratedProtocolMessageType('FP64', (_message.Message,), {'DESCRIPTOR': _TYPE_FP64, '__module__': 'substrait.type_pb2'}), 'String': _reflection.GeneratedProtocolMessageType('String', (_message.Message,), {'DESCRIPTOR': _TYPE_STRING, '__module__': 'substrait.type_pb2'}), 'Binary': _reflection.GeneratedProtocolMessageType('Binary', (_message.Message,), {'DESCRIPTOR': _TYPE_BINARY, '__module__': 'substrait.type_pb2'}), 'Timestamp': _reflection.GeneratedProtocolMessageType('Timestamp', (_message.Message,), {'DESCRIPTOR': _TYPE_TIMESTAMP, '__module__': 'substrait.type_pb2'}), 'Date': _reflection.GeneratedProtocolMessageType('Date', (_message.Message,), {'DESCRIPTOR': _TYPE_DATE, '__module__': 'substrait.type_pb2'}), 'Time': _reflection.GeneratedProtocolMessageType('Time', (_message.Message,), {'DESCRIPTOR': _TYPE_TIME, '__module__': 'substrait.type_pb2'}), 'TimestampTZ': _reflection.GeneratedProtocolMessageType('TimestampTZ', (_message.Message,), {'DESCRIPTOR': _TYPE_TIMESTAMPTZ, '__module__': 'substrait.type_pb2'}), 'IntervalYear': _reflection.GeneratedProtocolMessageType('IntervalYear', (_message.Message,), {'DESCRIPTOR': _TYPE_INTERVALYEAR, '__module__': 'substrait.type_pb2'}), 'IntervalDay': _reflection.GeneratedProtocolMessageType('IntervalDay', (_message.Message,), {'DESCRIPTOR': _TYPE_INTERVALDAY, '__module__': 'substrait.type_pb2'}), 'UUID': _reflection.GeneratedProtocolMessageType('UUID', (_message.Message,), {'DESCRIPTOR': _TYPE_UUID, '__module__': 'substrait.type_pb2'}), 'FixedChar': _reflection.GeneratedProtocolMessageType('FixedChar', (_message.Message,), {'DESCRIPTOR': _TYPE_FIXEDCHAR, '__module__': 'substrait.type_pb2'}), 'VarChar': _reflection.GeneratedProtocolMessageType('VarChar', (_message.Message,), {'DESCRIPTOR': _TYPE_VARCHAR, '__module__': 'substrait.type_pb2'}), 'FixedBinary': _reflection.GeneratedProtocolMessageType('FixedBinary', (_message.Message,), {'DESCRIPTOR': _TYPE_FIXEDBINARY, '__module__': 'substrait.type_pb2'}), 'Decimal': _reflection.GeneratedProtocolMessageType('Decimal', (_message.Message,), {'DESCRIPTOR': _TYPE_DECIMAL, '__module__': 'substrait.type_pb2'}), 'Struct': _reflection.GeneratedProtocolMessageType('Struct', (_message.Message,), {'DESCRIPTOR': _TYPE_STRUCT, '__module__': 'substrait.type_pb2'}), 'List': _reflection.GeneratedProtocolMessageType('List', (_message.Message,), {'DESCRIPTOR': _TYPE_LIST, '__module__': 'substrait.type_pb2'}), 'Map': _reflection.GeneratedProtocolMessageType('Map', (_message.Message,), {'DESCRIPTOR': _TYPE_MAP, '__module__': 'substrait.type_pb2'}), 'UserDefined': _reflection.GeneratedProtocolMessageType('UserDefined', (_message.Message,), {'DESCRIPTOR': _TYPE_USERDEFINED, '__module__': 'substrait.type_pb2'}), 'Parameter': _reflection.GeneratedProtocolMessageType('Parameter', (_message.Message,), {'DESCRIPTOR': _TYPE_PARAMETER, '__module__': 'substrait.type_pb2'}), 'DESCRIPTOR': _TYPE, '__module__': 'substrait.type_pb2'})
-_sym_db.RegisterMessage(Type)
-_sym_db.RegisterMessage(Type.Boolean)
-_sym_db.RegisterMessage(Type.I8)
-_sym_db.RegisterMessage(Type.I16)
-_sym_db.RegisterMessage(Type.I32)
-_sym_db.RegisterMessage(Type.I64)
-_sym_db.RegisterMessage(Type.FP32)
-_sym_db.RegisterMessage(Type.FP64)
-_sym_db.RegisterMessage(Type.String)
-_sym_db.RegisterMessage(Type.Binary)
-_sym_db.RegisterMessage(Type.Timestamp)
-_sym_db.RegisterMessage(Type.Date)
-_sym_db.RegisterMessage(Type.Time)
-_sym_db.RegisterMessage(Type.TimestampTZ)
-_sym_db.RegisterMessage(Type.IntervalYear)
-_sym_db.RegisterMessage(Type.IntervalDay)
-_sym_db.RegisterMessage(Type.UUID)
-_sym_db.RegisterMessage(Type.FixedChar)
-_sym_db.RegisterMessage(Type.VarChar)
-_sym_db.RegisterMessage(Type.FixedBinary)
-_sym_db.RegisterMessage(Type.Decimal)
-_sym_db.RegisterMessage(Type.Struct)
-_sym_db.RegisterMessage(Type.List)
-_sym_db.RegisterMessage(Type.Map)
-_sym_db.RegisterMessage(Type.UserDefined)
-_sym_db.RegisterMessage(Type.Parameter)
-NamedStruct = _reflection.GeneratedProtocolMessageType('NamedStruct', (_message.Message,), {'DESCRIPTOR': _NAMEDSTRUCT, '__module__': 'substrait.type_pb2'})
-_sym_db.RegisterMessage(NamedStruct)
-if _descriptor._USE_C_DESCRIPTORS == False:
-    DESCRIPTOR._options = None
-    DESCRIPTOR._serialized_options = b'\n\x12io.substrait.protoP\x01Z*github.com/substrait-io/substrait-go/proto\xaa\x02\x12Substrait.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 = 65
-    _TYPE._serialized_end = 5237
-    _TYPE_BOOLEAN._serialized_start = 1364
-    _TYPE_BOOLEAN._serialized_end = 1494
-    _TYPE_I8._serialized_start = 1496
-    _TYPE_I8._serialized_end = 1621
-    _TYPE_I16._serialized_start = 1623
-    _TYPE_I16._serialized_end = 1749
-    _TYPE_I32._serialized_start = 1751
-    _TYPE_I32._serialized_end = 1877
-    _TYPE_I64._serialized_start = 1879
-    _TYPE_I64._serialized_end = 2005
-    _TYPE_FP32._serialized_start = 2007
-    _TYPE_FP32._serialized_end = 2134
-    _TYPE_FP64._serialized_start = 2136
-    _TYPE_FP64._serialized_end = 2263
-    _TYPE_STRING._serialized_start = 2266
-    _TYPE_STRING._serialized_end = 2395
-    _TYPE_BINARY._serialized_start = 2398
-    _TYPE_BINARY._serialized_end = 2527
-    _TYPE_TIMESTAMP._serialized_start = 2530
-    _TYPE_TIMESTAMP._serialized_end = 2662
-    _TYPE_DATE._serialized_start = 2664
-    _TYPE_DATE._serialized_end = 2791
-    _TYPE_TIME._serialized_start = 2793
-    _TYPE_TIME._serialized_end = 2920
-    _TYPE_TIMESTAMPTZ._serialized_start = 2923
-    _TYPE_TIMESTAMPTZ._serialized_end = 3057
-    _TYPE_INTERVALYEAR._serialized_start = 3060
-    _TYPE_INTERVALYEAR._serialized_end = 3195
-    _TYPE_INTERVALDAY._serialized_start = 3198
-    _TYPE_INTERVALDAY._serialized_end = 3332
-    _TYPE_UUID._serialized_start = 3334
-    _TYPE_UUID._serialized_end = 3461
-    _TYPE_FIXEDCHAR._serialized_start = 3464
-    _TYPE_FIXEDCHAR._serialized_end = 3620
-    _TYPE_VARCHAR._serialized_start = 3623
-    _TYPE_VARCHAR._serialized_end = 3777
-    _TYPE_FIXEDBINARY._serialized_start = 3780
-    _TYPE_FIXEDBINARY._serialized_end = 3938
-    _TYPE_DECIMAL._serialized_start = 3941
-    _TYPE_DECIMAL._serialized_end = 4123
-    _TYPE_STRUCT._serialized_start = 4126
-    _TYPE_STRUCT._serialized_end = 4294
-    _TYPE_LIST._serialized_start = 4297
-    _TYPE_LIST._serialized_end = 4461
-    _TYPE_MAP._serialized_start = 4464
-    _TYPE_MAP._serialized_end = 4664
-    _TYPE_USERDEFINED._serialized_start = 4667
-    _TYPE_USERDEFINED._serialized_end = 4908
-    _TYPE_PARAMETER._serialized_start = 4911
-    _TYPE_PARAMETER._serialized_end = 5133
-    _TYPE_NULLABILITY._serialized_start = 5135
-    _TYPE_NULLABILITY._serialized_end = 5229
-    _NAMEDSTRUCT._serialized_start = 5239
-    _NAMEDSTRUCT._serialized_end = 5322
\ No newline at end of file
diff --git a/poetry-overrides.nix b/poetry-overrides.nix
index 9dc1cb5a..a1c580b1 100644
--- a/poetry-overrides.nix
+++ b/poetry-overrides.nix
@@ -15,9 +15,9 @@ self: super:
 
       nativeBuildInputs = attrs.nativeBuildInputs or [ ] ++ [ self.pyext ];
       propagatedNativeBuildInputs = attrs.propagatedNativeBuildInputs or [ ] ++ [
-        pkgs.buildPackages.protobuf
+        pkgs.buildPackages.protobuf3_20
       ];
-      buildInputs = attrs.buildInputs or [ ] ++ [ pkgs.buildPackages.protobuf ];
+      buildInputs = attrs.buildInputs or [ ] ++ [ pkgs.buildPackages.protobuf3_20 ];
       preConfigure = ''
         export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp
         export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION=2
@@ -40,4 +40,7 @@ self: super:
 
   pandas = parallelizeSetuptoolsBuild super.pandas;
   pydantic = parallelizeSetuptoolsBuild super.pydantic;
+  substrait-validator = super.substrait-validator.override {
+    preferWheel = true;
+  };
 }
diff --git a/poetry.lock b/poetry.lock
index b8c9182f..d9daf449 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -271,6 +271,14 @@ requirements_deprecated_finder = ["pipreqs", "pip-api"]
 colors = ["colorama (>=0.4.3,<0.5.0)"]
 plugins = ["setuptools"]
 
+[[package]]
+name = "jdot"
+version = "0.5"
+description = ""
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
 [[package]]
 name = "jedi"
 version = "0.18.1"
@@ -486,11 +494,11 @@ wcwidth = "*"
 
 [[package]]
 name = "protobuf"
-version = "3.19.4"
+version = "3.20.0"
 description = "Protocol Buffers"
 category = "main"
 optional = false
-python-versions = ">=3.5"
+python-versions = ">=3.7"
 
 [[package]]
 name = "protoletariat"
@@ -645,6 +653,17 @@ pytest = ">=4.6"
 [package.extras]
 testing = ["virtualenv", "pytest-xdist", "six", "process-tests", "hunter", "fields"]
 
+[[package]]
+name = "pytest-lazy-fixture"
+version = "0.6.3"
+description = "It helps to use fixtures in pytest.mark.parametrize"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+pytest = ">=3.2.5"
+
 [[package]]
 name = "pytest-mock"
 version = "3.8.2"
@@ -701,6 +720,14 @@ python-versions = ">=3.7"
 [package.dependencies]
 tokenize-rt = ">=3.2.0"
 
+[[package]]
+name = "pyyaml"
+version = "6.0"
+description = "YAML parser and emitter for Python"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
 [[package]]
 name = "regex"
 version = "2022.7.25"
@@ -757,6 +784,23 @@ pure-eval = "*"
 [package.extras]
 tests = ["cython", "littleutils", "pygments", "typeguard", "pytest"]
 
+[[package]]
+name = "substrait-validator"
+version = "0.0.7"
+description = "Validator for Substrait query plans"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+click = ">=8"
+jdot = ">=0.5"
+protobuf = ">3.19.3"
+pyyaml = ">=6"
+
+[package.extras]
+test = ["pytest (<5.0.0)"]
+
 [[package]]
 name = "tabulate"
 version = "0.8.10"
@@ -850,7 +894,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-
 [metadata]
 lock-version = "1.1"
 python-versions = ">=3.8,<3.11"
-content-hash = "b7cebf3649fce609e4414d169f214bc48b4c94059f7c3f0ba403ec08bf6da088"
+content-hash = "c34618cf33341656fb7dd77ec0d80aca8dda9c9203eadc536730a387a97f490a"
 
 [metadata.files]
 appnope = [
@@ -992,6 +1036,10 @@ isort = [
     {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"},
     {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"},
 ]
+jdot = [
+    {file = "jdot-0.5-py2.py3-none-any.whl", hash = "sha256:ef678e8310bda8a7048ccd3af79c9c17b50b0ef69db71f71b4649d8b7c4dc656"},
+    {file = "jdot-0.5.tar.gz", hash = "sha256:e60bd08559a92246700089a8f1b346885b50c81271c174c553e9a712a5786811"},
+]
 jedi = [
     {file = "jedi-0.18.1-py2.py3-none-any.whl", hash = "sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d"},
     {file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"},
@@ -1130,32 +1178,30 @@ prompt-toolkit = [
     {file = "prompt_toolkit-3.0.30.tar.gz", hash = "sha256:859b283c50bde45f5f97829f77a4674d1c1fcd88539364f1b28a37805cfd89c0"},
 ]
 protobuf = [
-    {file = "protobuf-3.19.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f51d5a9f137f7a2cec2d326a74b6e3fc79d635d69ffe1b036d39fc7d75430d37"},
-    {file = "protobuf-3.19.4-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:09297b7972da685ce269ec52af761743714996b4381c085205914c41fcab59fb"},
-    {file = "protobuf-3.19.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:072fbc78d705d3edc7ccac58a62c4c8e0cec856987da7df8aca86e647be4e35c"},
-    {file = "protobuf-3.19.4-cp310-cp310-win32.whl", hash = "sha256:7bb03bc2873a2842e5ebb4801f5c7ff1bfbdf426f85d0172f7644fcda0671ae0"},
-    {file = "protobuf-3.19.4-cp310-cp310-win_amd64.whl", hash = "sha256:f358aa33e03b7a84e0d91270a4d4d8f5df6921abe99a377828839e8ed0c04e07"},
-    {file = "protobuf-3.19.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1c91ef4110fdd2c590effb5dca8fdbdcb3bf563eece99287019c4204f53d81a4"},
-    {file = "protobuf-3.19.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c438268eebb8cf039552897d78f402d734a404f1360592fef55297285f7f953f"},
-    {file = "protobuf-3.19.4-cp36-cp36m-win32.whl", hash = "sha256:835a9c949dc193953c319603b2961c5c8f4327957fe23d914ca80d982665e8ee"},
-    {file = "protobuf-3.19.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4276cdec4447bd5015453e41bdc0c0c1234eda08420b7c9a18b8d647add51e4b"},
-    {file = "protobuf-3.19.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6cbc312be5e71869d9d5ea25147cdf652a6781cf4d906497ca7690b7b9b5df13"},
-    {file = "protobuf-3.19.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:54a1473077f3b616779ce31f477351a45b4fef8c9fd7892d6d87e287a38df368"},
-    {file = "protobuf-3.19.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:435bb78b37fc386f9275a7035fe4fb1364484e38980d0dd91bc834a02c5ec909"},
-    {file = "protobuf-3.19.4-cp37-cp37m-win32.whl", hash = "sha256:16f519de1313f1b7139ad70772e7db515b1420d208cb16c6d7858ea989fc64a9"},
-    {file = "protobuf-3.19.4-cp37-cp37m-win_amd64.whl", hash = "sha256:cdc076c03381f5c1d9bb1abdcc5503d9ca8b53cf0a9d31a9f6754ec9e6c8af0f"},
-    {file = "protobuf-3.19.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:69da7d39e39942bd52848438462674c463e23963a1fdaa84d88df7fbd7e749b2"},
-    {file = "protobuf-3.19.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:48ed3877fa43e22bcacc852ca76d4775741f9709dd9575881a373bd3e85e54b2"},
-    {file = "protobuf-3.19.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd95d1dfb9c4f4563e6093a9aa19d9c186bf98fa54da5252531cc0d3a07977e7"},
-    {file = "protobuf-3.19.4-cp38-cp38-win32.whl", hash = "sha256:b38057450a0c566cbd04890a40edf916db890f2818e8682221611d78dc32ae26"},
-    {file = "protobuf-3.19.4-cp38-cp38-win_amd64.whl", hash = "sha256:7ca7da9c339ca8890d66958f5462beabd611eca6c958691a8fe6eccbd1eb0c6e"},
-    {file = "protobuf-3.19.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:36cecbabbda242915529b8ff364f2263cd4de7c46bbe361418b5ed859677ba58"},
-    {file = "protobuf-3.19.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:c1068287025f8ea025103e37d62ffd63fec8e9e636246b89c341aeda8a67c934"},
-    {file = "protobuf-3.19.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96bd766831596d6014ca88d86dc8fe0fb2e428c0b02432fd9db3943202bf8c5e"},
-    {file = "protobuf-3.19.4-cp39-cp39-win32.whl", hash = "sha256:84123274d982b9e248a143dadd1b9815049f4477dc783bf84efe6250eb4b836a"},
-    {file = "protobuf-3.19.4-cp39-cp39-win_amd64.whl", hash = "sha256:3112b58aac3bac9c8be2b60a9daf6b558ca3f7681c130dcdd788ade7c9ffbdca"},
-    {file = "protobuf-3.19.4-py2.py3-none-any.whl", hash = "sha256:8961c3a78ebfcd000920c9060a262f082f29838682b1f7201889300c1fbe0616"},
-    {file = "protobuf-3.19.4.tar.gz", hash = "sha256:9df0c10adf3e83015ced42a9a7bd64e13d06c4cf45c340d2c63020ea04499d0a"},
+    {file = "protobuf-3.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9d0f3aca8ca51c8b5e204ab92bd8afdb2a8e3df46bd0ce0bd39065d79aabcaa4"},
+    {file = "protobuf-3.20.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:001c2160c03b6349c04de39cf1a58e342750da3632f6978a1634a3dcca1ec10e"},
+    {file = "protobuf-3.20.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b5860b790498f233cdc8d635a17fc08de62e59d4dcd8cdb6c6c0d38a31edf2b"},
+    {file = "protobuf-3.20.0-cp310-cp310-win32.whl", hash = "sha256:0b250c60256c8824219352dc2a228a6b49987e5bf94d3ffcf4c46585efcbd499"},
+    {file = "protobuf-3.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:a1eebb6eb0653e594cb86cd8e536b9b083373fca9aba761ade6cd412d46fb2ab"},
+    {file = "protobuf-3.20.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:bc14037281db66aa60856cd4ce4541a942040686d290e3f3224dd3978f88f554"},
+    {file = "protobuf-3.20.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:47257d932de14a7b6c4ae1b7dbf592388153ee35ec7cae216b87ae6490ed39a3"},
+    {file = "protobuf-3.20.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fbcbb068ebe67c4ff6483d2e2aa87079c325f8470b24b098d6bf7d4d21d57a69"},
+    {file = "protobuf-3.20.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:542f25a4adf3691a306dcc00bf9a73176554938ec9b98f20f929a044f80acf1b"},
+    {file = "protobuf-3.20.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fd7133b885e356fa4920ead8289bb45dc6f185a164e99e10279f33732ed5ce15"},
+    {file = "protobuf-3.20.0-cp37-cp37m-win32.whl", hash = "sha256:8d84453422312f8275455d1cb52d850d6a4d7d714b784e41b573c6f5bfc2a029"},
+    {file = "protobuf-3.20.0-cp37-cp37m-win_amd64.whl", hash = "sha256:52bae32a147c375522ce09bd6af4d2949aca32a0415bc62df1456b3ad17c6001"},
+    {file = "protobuf-3.20.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25d2fcd6eef340082718ec9ad2c58d734429f2b1f7335d989523852f2bba220b"},
+    {file = "protobuf-3.20.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:88c8be0558bdfc35e68c42ae5bf785eb9390d25915d4863bbc7583d23da77074"},
+    {file = "protobuf-3.20.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:38fd9eb74b852e4ee14b16e9670cd401d147ee3f3ec0d4f7652e0c921d6227f8"},
+    {file = "protobuf-3.20.0-cp38-cp38-win32.whl", hash = "sha256:7dcd84dc31ebb35ade755e06d1561d1bd3b85e85dbdbf6278011fc97b22810db"},
+    {file = "protobuf-3.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:1eb13f5a5a59ca4973bcfa2fc8fff644bd39f2109c3f7a60bd5860cb6a49b679"},
+    {file = "protobuf-3.20.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d24c81c2310f0063b8fc1c20c8ed01f3331be9374b4b5c2de846f69e11e21fb"},
+    {file = "protobuf-3.20.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8be43a91ab66fe995e85ccdbdd1046d9f0443d59e060c0840319290de25b7d33"},
+    {file = "protobuf-3.20.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7a53d4035427b9dbfbb397f46642754d294f131e93c661d056366f2a31438263"},
+    {file = "protobuf-3.20.0-cp39-cp39-win32.whl", hash = "sha256:32bf4a90c207a0b4e70ca6dd09d43de3cb9898f7d5b69c2e9e3b966a7f342820"},
+    {file = "protobuf-3.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:6efe066a7135233f97ce51a1aa007d4fb0be28ef093b4f88dac4ad1b3a2b7b6f"},
+    {file = "protobuf-3.20.0-py2.py3-none-any.whl", hash = "sha256:4eda68bd9e2a4879385e6b1ea528c976f59cd9728382005cc54c28bcce8db983"},
+    {file = "protobuf-3.20.0.tar.gz", hash = "sha256:71b2c3d1cd26ed1ec7c8196834143258b2ad7f444efff26fdc366c6f5e752702"},
 ]
 protoletariat = [
     {file = "protoletariat-0.9.4-py3-none-any.whl", hash = "sha256:25f2dec490ef66a3a577c6956d03835ffbcb769865ecefd709798a81ffd46b30"},
@@ -1241,6 +1287,10 @@ pytest-cov = [
     {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"},
     {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"},
 ]
+pytest-lazy-fixture = [
+    {file = "pytest-lazy-fixture-0.6.3.tar.gz", hash = "sha256:0e7d0c7f74ba33e6e80905e9bfd81f9d15ef9a790de97993e34213deb5ad10ac"},
+    {file = "pytest_lazy_fixture-0.6.3-py3-none-any.whl", hash = "sha256:e0b379f38299ff27a653f03eaa69b08a6fd4484e46fd1c9907d984b9f9daeda6"},
+]
 pytest-mock = [
     {file = "pytest-mock-3.8.2.tar.gz", hash = "sha256:77f03f4554392558700295e05aed0b1096a20d4a60a4f3ddcde58b0c31c8fca2"},
     {file = "pytest_mock-3.8.2-py3-none-any.whl", hash = "sha256:8a9e226d6c0ef09fcf20c94eb3405c388af438a90f3e39687f84166da82d5948"},
@@ -1261,6 +1311,41 @@ pyupgrade = [
     {file = "pyupgrade-2.37.3-py2.py3-none-any.whl", hash = "sha256:9746efd064dbf53d7f86d6f88a1d48120f58dbfc378f517768634740ea2225e2"},
     {file = "pyupgrade-2.37.3.tar.gz", hash = "sha256:1414c7a7c558004cf610e6180716b876814b639b5a5789c3da023c5cdaebcd49"},
 ]
+pyyaml = [
+    {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
+    {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
+    {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
+    {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
+    {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"},
+    {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"},
+    {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"},
+    {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"},
+    {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"},
+    {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"},
+    {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
+    {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
+    {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
+    {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
+    {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
+    {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
+    {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
+    {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
+]
 regex = [
     {file = "regex-2022.7.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:55911aba9bae9ad826971d2c80428425625a3dd0c00b94e9bb19361888b983a6"},
     {file = "regex-2022.7.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1dee18c683a0603445ff9e77ffc39f1a3997f43ee07ae04ac80228fc5565fc4d"},
@@ -1353,6 +1438,23 @@ stack-data = [
     {file = "stack_data-0.3.0-py3-none-any.whl", hash = "sha256:aa1d52d14d09c7a9a12bb740e6bdfffe0f5e8f4f9218d85e7c73a8c37f7ae38d"},
     {file = "stack_data-0.3.0.tar.gz", hash = "sha256:77bec1402dcd0987e9022326473fdbcc767304892a533ed8c29888dacb7dddbc"},
 ]
+substrait-validator = [
+    {file = "substrait_validator-0.0.7-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:b89c99e3885c7e1cbcf5994aff5d9d3973cffd553f9947f77b0133747dae8a08"},
+    {file = "substrait_validator-0.0.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fe9354baa1a391458f34efbe20ad8a13f83ecfe443775f634c0d442cf0809f78"},
+    {file = "substrait_validator-0.0.7-cp310-none-win_amd64.whl", hash = "sha256:439a73cb92bd5b539b722480b8f92fbbd1d1c77833db02732752172dfa7435f7"},
+    {file = "substrait_validator-0.0.7-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:027f5fe54f62ca2804ea7077faef04e45c30482ce0b6502fa20a1a01d8b07013"},
+    {file = "substrait_validator-0.0.7-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:92b7ed46fb670430e9e1f1774981f392cc68249009f2cde0c5be97f9eac9d715"},
+    {file = "substrait_validator-0.0.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4cf4ec4b805ab408aef6da2bbc62ae8da5e3623b29fb987a0d9cc7684b0f4b86"},
+    {file = "substrait_validator-0.0.7-cp37-none-win_amd64.whl", hash = "sha256:359fecb98f32dfac673e0c68d76f680e25e30c5a1461dd9465ad95cf2c0e30a9"},
+    {file = "substrait_validator-0.0.7-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:cd3dffb0e1b2c7eabf33117e20ae4a827a7d74712252f4794e5d09f0ddf7839e"},
+    {file = "substrait_validator-0.0.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eef0e6dbb49493772d5bb21d0856111c6ca83e699f68f9dad27821c1b26b7e"},
+    {file = "substrait_validator-0.0.7-cp38-none-win_amd64.whl", hash = "sha256:bcd543f6d893614bab1e915ce75d77f36800fd06b88b1be699a7592ce8f3ea90"},
+    {file = "substrait_validator-0.0.7-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:eb5268424029a796b7d27ed68cb37c495fa42a8adfd5f25bb19597a86c4be8ea"},
+    {file = "substrait_validator-0.0.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:5ea66e29e8236dfad2484044d8ef97e6ad0339247a75079268119585d7c04e33"},
+    {file = "substrait_validator-0.0.7-cp39-none-win_amd64.whl", hash = "sha256:f64126e3a14be831dd340535b96d25c54f92d6a6ff5820d0c63089f5adf8d366"},
+    {file = "substrait_validator-0.0.7-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:5ebd4e8829516b3f1df43b7c8b950548fe61f3b2ca5c918bcaf5619a44b80caf"},
+    {file = "substrait_validator-0.0.7.tar.gz", hash = "sha256:1d6aa3992151d9a3a3ddc6fe0460ae0411d996522c2a7dba60b47c7f138048ab"},
+]
 tabulate = [
     {file = "tabulate-0.8.10-py3-none-any.whl", hash = "sha256:0ba055423dbaa164b9e456abe7920c5e8ed33fcc16f6d1b2f2d152c8e1e8b4fc"},
     {file = "tabulate-0.8.10-py3.8.egg", hash = "sha256:436f1c768b424654fce8597290d2764def1eea6a77cfa5c33be00b1bc0f4f63d"},
diff --git a/proto_prefix.py b/proto_prefix.py
new file mode 100644
index 00000000..bb80cca7
--- /dev/null
+++ b/proto_prefix.py
@@ -0,0 +1,397 @@
+#!/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 fb753578..aa765531 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -23,7 +23,7 @@ python = ">=3.8,<3.11"
 ibis-framework = ">=2,<4"
 packaging = "^21.3"
 platformdirs = "<2.5.3"
-protobuf = ">=3.19,<3.20" # protobuf==3.20 C extensions aren't compatible with 3.19.4
+protobuf = "3.20.0" # protobuf==3.20 C extensions aren't compatible with 3.19.4
 
 [tool.poetry.dev-dependencies]
 black = "^22.1.0"
@@ -43,6 +43,8 @@ pytz = "^2022.1"
 pyupgrade = "^2.26.0"
 types-protobuf = "^3.18.1"
 types-pytz = "^2022.0.0"
+pytest-lazy-fixture = "^0.6.3"
+substrait-validator = "^0.0.7"
 
 [tool.pytest.ini_options]
 xfail_strict = true
diff --git a/shell.nix b/shell.nix
index a4009bab..ecfcde72 100644
--- a/shell.nix
+++ b/shell.nix
@@ -15,7 +15,7 @@ let
     nix-linter
     nixpkgs-fmt
     prettierTOML
-    protobuf
+    protobuf3_20
     sd
     shellcheck
     shfmt
@@ -36,8 +36,14 @@ let
       find "$proto_dir" -type d -exec chmod u+rwx {} +
       find "$proto_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
     '';
   };
 in


Test patch:
diff --git a/ibis_substrait/tests/compiler/conftest.py b/ibis_substrait/tests/compiler/conftest.py
index 744b073a..815a1d5f 100644
--- a/ibis_substrait/tests/compiler/conftest.py
+++ b/ibis_substrait/tests/compiler/conftest.py
@@ -38,3 +38,111 @@ def lineitem():
         ],
         name="lineitem",
     )
+
+
+@pytest.fixture
+def orders():
+    return ibis.table(
+        [
+            ("o_orderkey", dt.int32(nullable=False)),
+            ("o_custkey", dt.int32(nullable=False)),
+            ("o_orderstatus", dt.string(nullable=False)),
+            ("o_totalprice", dt.Decimal(precision=15, scale=2, nullable=False)),
+            ("o_orderdate", dt.date(nullable=False)),
+            ("o_orderpriority", dt.string(nullable=False)),
+            ("o_clerk", dt.string(nullable=False)),
+            ("o_shippriority", dt.int32(nullable=False)),
+            ("o_comment", dt.string(nullable=False)),
+        ],
+        name="orders",
+    )
+
+
+@pytest.fixture
+def partsupp():
+    return ibis.table(
+        [
+            ("ps_partkey", dt.int32(nullable=False)),
+            ("ps_suppkey", dt.int32(nullable=False)),
+            ("ps_availqty", dt.int32(nullable=False)),
+            ("ps_supplycost", dt.Decimal(precision=15, scale=2, nullable=False)),
+            ("ps_comment", dt.string(nullable=False)),
+        ],
+        name="partsupp",
+    )
+
+
+@pytest.fixture
+def part():
+    return ibis.table(
+        [
+            ("p_partkey", dt.int32(nullable=False)),
+            ("p_name", dt.string(nullable=False)),
+            ("p_mfgr", dt.string(nullable=False)),
+            ("p_brand", dt.string(nullable=False)),
+            ("p_type", dt.string(nullable=False)),
+            ("p_size", dt.int32(nullable=False)),
+            ("p_container", dt.string(nullable=False)),
+            ("p_retailprice", dt.Decimal(precision=15, scale=2, nullable=False)),
+            ("p_comment", dt.string(nullable=False)),
+        ],
+        name="part",
+    )
+
+
+@pytest.fixture
+def customer():
+    return ibis.table(
+        [
+            ("c_custkey", dt.int32(nullable=False)),
+            ("c_name", dt.string(nullable=False)),
+            ("c_address", dt.string(nullable=False)),
+            ("c_nationkey", dt.int32(nullable=False)),
+            ("c_phone", dt.string(nullable=False)),
+            ("c_acctbal", dt.Decimal(precision=15, scale=2, nullable=False)),
+            ("c_mktsegment", dt.string(nullable=False)),
+            ("c_comment", dt.string(nullable=False)),
+        ],
+        name="customer",
+    )
+
+
+@pytest.fixture
+def supplier():
+    return ibis.table(
+        [
+            ("s_suppkey", dt.int32(nullable=False)),
+            ("s_name", dt.string(nullable=False)),
+            ("s_address", dt.string(nullable=False)),
+            ("s_nationkey", dt.int32(nullable=False)),
+            ("s_phone", dt.string(nullable=False)),
+            ("s_acctbal", dt.Decimal(precision=15, scale=2, nullable=False)),
+            ("s_comment", dt.string(nullable=False)),
+        ],
+        name="supplier",
+    )
+
+
+@pytest.fixture
+def nation():
+    return ibis.table(
+        [
+            ("n_nationkey", dt.int32(nullable=False)),
+            ("n_name", dt.string(nullable=False)),
+            ("n_regionkey", dt.int32(nullable=False)),
+            ("n_comment", dt.string(nullable=False)),
+        ],
+        name="nation",
+    )
+
+
+@pytest.fixture
+def region():
+    return ibis.table(
+        [
+            ("r_regionkey", dt.int32(nullable=False)),
+            ("r_name", dt.string(nullable=False)),
+            ("r_comment", dt.string(nullable=False)),
+        ],
+        name="region",
+    )
diff --git a/ibis_substrait/tests/compiler/test_compiler.py b/ibis_substrait/tests/compiler/test_compiler.py
index 0bf646e9..941c5f0f 100644
--- a/ibis_substrait/tests/compiler/test_compiler.py
+++ b/ibis_substrait/tests/compiler/test_compiler.py
@@ -6,8 +6,8 @@
 from google.protobuf import json_format
 
 from ibis_substrait.compiler.translate import translate
-from ibis_substrait.proto.substrait import algebra_pb2 as stalg
-from ibis_substrait.proto.substrait import type_pb2 as stt
+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 7805d2b4..899c60e6 100644
--- a/ibis_substrait/tests/compiler/test_decompiler.py
+++ b/ibis_substrait/tests/compiler/test_decompiler.py
@@ -4,7 +4,7 @@
 from packaging import version
 
 from ibis_substrait.compiler.decompile import decompile, decompile_schema
-from ibis_substrait.proto.substrait import type_pb2 as stt
+from ibis_substrait.proto.substrait.ibis import type_pb2 as stt
 
 
 @pytest.fixture
diff --git a/ibis_substrait/tests/compiler/test_literal.py b/ibis_substrait/tests/compiler/test_literal.py
index 6b36bf7b..a93445b9 100644
--- a/ibis_substrait/tests/compiler/test_literal.py
+++ b/ibis_substrait/tests/compiler/test_literal.py
@@ -10,8 +10,8 @@
 
 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 import algebra_pb2 as stalg
-from ibis_substrait.proto.substrait import type_pb2 as stt
+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
 
diff --git a/ibis_substrait/tests/compiler/test_tpch.py b/ibis_substrait/tests/compiler/test_tpch.py
index 2ccf0ede..748c3298 100644
--- a/ibis_substrait/tests/compiler/test_tpch.py
+++ b/ibis_substrait/tests/compiler/test_tpch.py
@@ -3,12 +3,14 @@
 import ibis
 import pytest
 from packaging import version
+from pytest_lazyfixture import lazy_fixture
+from substrait_validator import Config, check_plan
 
 from ibis_substrait.compiler.decompile import decompile
 
 
 @pytest.fixture
-def tpch1(lineitem):
+def tpc_h01(lineitem):
     return (
         lineitem.filter(lambda t: t.l_shipdate <= date(year=1998, month=9, day=2))
         .group_by(["l_returnflag", "l_linestatus"])
@@ -28,12 +30,598 @@ def tpch1(lineitem):
     )
 
 
+@pytest.fixture
+def tpc_h02(
+    part, supplier, partsupp, nation, region, REGION="EUROPE", SIZE=25, TYPE="BRASS"
+):
+    "Minimum Cost Supplier Query (Q2)"
+
+    expr = (
+        part.join(partsupp, part.p_partkey == partsupp.ps_partkey)
+        .join(supplier, supplier.s_suppkey == partsupp.ps_suppkey)
+        .join(nation, supplier.s_nationkey == nation.n_nationkey)
+        .join(region, nation.n_regionkey == region.r_regionkey)
+    )
+
+    subexpr = (
+        partsupp.join(supplier, supplier.s_suppkey == partsupp.ps_suppkey)
+        .join(nation, supplier.s_nationkey == nation.n_nationkey)
+        .join(region, nation.n_regionkey == region.r_regionkey)
+    )
+
+    subexpr = subexpr[
+        (subexpr.r_name == REGION) & (expr.p_partkey == subexpr.ps_partkey)
+    ]
+
+    filters = [
+        expr.p_size == SIZE,
+        expr.p_type.like("%" + TYPE),
+        expr.r_name == REGION,
+        expr.ps_supplycost == subexpr.ps_supplycost.min(),
+    ]
+    q = expr.filter(filters)
+
+    q = q.select(
+        [
+            q.s_acctbal,
+            q.s_name,
+            q.n_name,
+            q.p_partkey,
+            q.p_mfgr,
+            q.s_address,
+            q.s_phone,
+            q.s_comment,
+        ]
+    )
+
+    return q.sort_by(
+        [
+            ibis.desc(q.s_acctbal),
+            q.n_name,
+            q.s_name,
+            q.p_partkey,
+        ]
+    ).limit(100)
+
+
+@pytest.fixture
+def tpc_h03(
+    customer,
+    orders,
+    lineitem,
+):
+    DATE = "1995-03-15"
+    q = customer.join(orders, customer.c_custkey == orders.o_custkey)
+    q = q.join(lineitem, lineitem.l_orderkey == orders.o_orderkey)
+    q = q.filter(
+        [q.c_mktsegment == "BUILDING", q.o_orderdate < DATE, q.l_shipdate > DATE]
+    )
+    qg = q.group_by([q.l_orderkey, q.o_orderdate, q.o_shippriority])
+    q = qg.aggregate(revenue=(q.l_extendedprice * (1 - q.l_discount)).sum())
+    q = q.sort_by([ibis.desc(q.revenue), q.o_orderdate])
+    q = q.limit(10)
+
+    return q
+
+
+@pytest.fixture
+def tpc_h04(orders, lineitem):
+    cond = (lineitem.l_orderkey == orders.o_orderkey) & (
+        lineitem.l_commitdate < lineitem.l_receiptdate
+    )
+    q = orders.filter(
+        [
+            cond.any(),
+            orders.o_orderdate >= "1993-07-01",
+            orders.o_orderdate < "1993-10-01",
+        ]
+    )
+    q = q.group_by([orders.o_orderpriority])
+    q = q.aggregate(order_count=orders.count())
+    q = q.sort_by([orders.o_orderpriority])
+    return q
+
+
+@pytest.fixture
+def tpc_h05(customer, orders, lineitem, supplier, nation, region):
+    q = customer
+    q = q.join(orders, customer.c_custkey == orders.o_custkey)
+    q = q.join(lineitem, lineitem.l_orderkey == orders.o_orderkey)
+    q = q.join(supplier, lineitem.l_suppkey == supplier.s_suppkey)
+    q = q.join(
+        nation,
+        (customer.c_nationkey == supplier.s_nationkey)
+        & (supplier.s_nationkey == nation.n_nationkey),
+    )
+    q = q.join(region, nation.n_regionkey == region.r_regionkey)
+
+    q = q.filter(
+        [
+            q.r_name == "ASIA",
+            q.o_orderdate >= "1994-01-01",
+            q.o_orderdate < "1995-01-01",
+        ]
+    )
+    revexpr = q.l_extendedprice * (1 - q.l_discount)
+    gq = q.group_by([q.n_name])
+    q = gq.aggregate(revenue=revexpr.sum())
+    q = q.sort_by([ibis.desc(q.revenue)])
+    return q
+
+
+@pytest.fixture
+def tpc_h06(lineitem):
+    q = lineitem
+    discount_min = round(0.06 - 0.01, 2)
+    discount_max = round(0.06 + 0.01, 2)
+    q = q.filter(
+        [
+            q.l_shipdate >= "1994-01-01",
+            q.l_shipdate < "1995-01-01",
+            q.l_discount.between(discount_min, discount_max),
+            q.l_quantity < 24,
+        ]
+    )
+    q = q.aggregate(revenue=(q.l_extendedprice * q.l_discount).sum())
+    return q
+
+
+@pytest.fixture
+def tpc_h07(supplier, lineitem, orders, customer, nation):
+    q = supplier
+    q = q.join(lineitem, supplier.s_suppkey == lineitem.l_suppkey)
+    q = q.join(orders, orders.o_orderkey == lineitem.l_orderkey)
+    q = q.join(customer, customer.c_custkey == orders.o_custkey)
+    n1 = nation
+    n2 = nation.view()
+    q = q.join(n1, supplier.s_nationkey == n1.n_nationkey)
+    q = q.join(n2, customer.c_nationkey == n2.n_nationkey)
+
+    q = q[
+        n1.n_name.name("supp_nation"),
+        n2.n_name.name("cust_nation"),
+        lineitem.l_shipdate,
+        lineitem.l_extendedprice,
+        lineitem.l_discount,
+        lineitem.l_shipdate.year().cast("string").name("l_year"),
+        (lineitem.l_extendedprice * (1 - lineitem.l_discount)).name("volume"),
+    ]
+
+    q = q.filter(
+        [
+            ((q.cust_nation == "FRANCE") & (q.supp_nation == "GERMANY"))
+            | ((q.cust_nation == "GERMANY") & (q.supp_nation == "FRANCE")),
+            q.l_shipdate.between("1995-01-01", "1996-12-31"),
+        ]
+    )
+
+    gq = q.group_by(["supp_nation", "cust_nation", "l_year"])
+    q = gq.aggregate(revenue=q.volume.sum())
+    q = q.sort_by(["supp_nation", "cust_nation", "l_year"])
+
+    return q
+
+
+@pytest.fixture
+def tpc_h08(
+    part,
+    supplier,
+    lineitem,
+    orders,
+    customer,
+    region,
+    nation,
+):
+    n1 = nation
+    n2 = n1.view()
+
+    q = part
+    q = q.join(lineitem, part.p_partkey == lineitem.l_partkey)
+    q = q.join(supplier, supplier.s_suppkey == lineitem.l_suppkey)
+    q = q.join(orders, lineitem.l_orderkey == orders.o_orderkey)
+    q = q.join(customer, orders.o_custkey == customer.c_custkey)
+    q = q.join(n1, customer.c_nationkey == n1.n_nationkey)
+    q = q.join(region, n1.n_regionkey == region.r_regionkey)
+    q = q.join(n2, supplier.s_nationkey == n2.n_nationkey)
+
+    q = q[
+        orders.o_orderdate.year().cast("string").name("o_year"),
+        (lineitem.l_extendedprice * (1 - lineitem.l_discount)).name("volume"),
+        n2.n_name.name("nation"),
+        region.r_name,
+        orders.o_orderdate,
+        part.p_type,
+    ]
+
+    q = q.filter(
+        [
+            q.r_name == "AMERICA",
+            q.o_orderdate.between("1995-01-01", "1996-12-31"),
+            q.p_type == "ECONOMY ANODIZED STEEL",
+        ]
+    )
+
+    q = q.mutate(
+        nation_volume=ibis.case().when(q.nation == "BRAZIL", q.volume).else_(0).end()
+    )
+    gq = q.group_by([q.o_year])
+    q = gq.aggregate(mkt_share=q.nation_volume.sum() / q.volume.sum())
+    q = q.sort_by([q.o_year])
+    return q
+
+
+@pytest.fixture
+def tpc_h09(part, supplier, lineitem, partsupp, orders, nation):
+
+    q = lineitem
+    q = q.join(supplier, supplier.s_suppkey == lineitem.l_suppkey)
+    q = q.join(
+        partsupp,
+        (partsupp.ps_suppkey == lineitem.l_suppkey)
+        & (partsupp.ps_partkey == lineitem.l_partkey),
+    )
+    q = q.join(part, part.p_partkey == lineitem.l_partkey)
+    q = q.join(orders, orders.o_orderkey == lineitem.l_orderkey)
+    q = q.join(nation, supplier.s_nationkey == nation.n_nationkey)
+
+    q = q[
+        (q.l_extendedprice * (1 - q.l_discount) - q.ps_supplycost * q.l_quantity).name(
+            "amount"
+        ),
+        q.o_orderdate.year().cast("string").name("o_year"),
+        q.n_name.name("nation"),
+        q.p_name,
+    ]
+
+    q = q.filter([q.p_name.like("%GREEN%")])
+
+    gq = q.group_by([q.nation, q.o_year])
+    q = gq.aggregate(sum_profit=q.amount.sum())
+    q = q.sort_by([q.nation, ibis.desc(q.o_year)])
+    return q
+
+
+@pytest.fixture
+def tpc_h10(customer, orders, lineitem, nation):
+    q = customer
+    q = q.join(orders, customer.c_custkey == orders.o_custkey)
+    q = q.join(lineitem, lineitem.l_orderkey == orders.o_orderkey)
+    q = q.join(nation, customer.c_nationkey == nation.n_nationkey)
+
+    q = q.filter(
+        [
+            (q.o_orderdate >= "1993-01-01") & (q.o_orderdate < "1993-04-01"),
+            q.l_returnflag == "R",
+        ]
+    )
+
+    gq = q.group_by(
+        [
+            q.c_custkey,
+            q.c_name,
+            q.c_acctbal,
+            q.c_phone,
+            q.n_name,
+            q.c_address,
+            q.c_comment,
+        ]
+    )
+    q = gq.aggregate(revenue=(q.l_extendedprice * (1 - q.l_discount)).sum())
+
+    q = q.sort_by(ibis.desc(q.revenue))
+    return q.limit(20)
+
+
+@pytest.fixture
+def tpc_h11(partsupp, supplier, nation):
+    q = partsupp
+    q = q.join(supplier, partsupp.ps_suppkey == supplier.s_suppkey)
+    q = q.join(nation, nation.n_nationkey == supplier.s_nationkey)
+
+    q = q.filter([q.n_name == "GERMANY"])
+
+    innerq = partsupp
+    innerq = innerq.join(supplier, partsupp.ps_suppkey == supplier.s_suppkey)
+    innerq = innerq.join(nation, nation.n_nationkey == supplier.s_nationkey)
+    innerq = innerq.filter([innerq.n_name == "GERMANY"])
+    innerq = innerq.aggregate(total=(innerq.ps_supplycost * innerq.ps_availqty).sum())
+
+    gq = q.group_by([q.ps_partkey])
+    q = gq.aggregate(value=(q.ps_supplycost * q.ps_availqty).sum())
+    q = q.filter([q.value > innerq.total * 0.0001])
+    q = q.sort_by(ibis.desc(q.value))
+    return q
+
+
+@pytest.fixture
+def tpc_h12(orders, lineitem):
+    q = orders
+    q = q.join(lineitem, orders.o_orderkey == lineitem.l_orderkey)
+
+    q = q.filter(
+        [
+            q.l_shipmode.isin(["MAIL", "SHIP"]),
+            q.l_commitdate < q.l_receiptdate,
+            q.l_shipdate < q.l_commitdate,
+            q.l_receiptdate >= "1994-01-01",
+            q.l_receiptdate < "1995-01-01",
+        ]
+    )
+
+    gq = q.group_by([q.l_shipmode])
+    q = gq.aggregate(
+        high_line_count=(
+            q.o_orderpriority.case()
+            .when("1-URGENT", 1)
+            .when("2-HIGH", 1)
+            .else_(0)
+            .end()
+        ).sum(),
+        low_line_count=(
+            q.o_orderpriority.case()
+            .when("1-URGENT", 0)
+            .when("2-HIGH", 0)
+            .else_(1)
+            .end()
+        ).sum(),
+    )
+    q = q.sort_by(q.l_shipmode)
+
+    return q
+
+
+@pytest.fixture
+def tpc_h13(customer, orders):
+    innerq = customer
+    innerq = innerq.left_join(
+        orders,
+        (customer.c_custkey == orders.o_custkey)
+        & ~orders.o_comment.like("%special%requests%"),
+    )
+    innergq = innerq.group_by([innerq.c_custkey])
+    innerq = innergq.aggregate(c_count=innerq.o_orderkey.count())
+
+    gq = innerq.group_by([innerq.c_count])
+    q = gq.aggregate(custdist=innerq.count())
+
+    q = q.sort_by([ibis.desc(q.custdist), ibis.desc(q.c_count)])
+    return q
+
+
+@pytest.fixture
+def tpc_h14(lineitem, part):
+    q = lineitem
+    q = q.join(part, lineitem.l_partkey == part.p_partkey)
+    q = q.filter([q.l_shipdate >= "1995-09-01", q.l_shipdate < "1995-10-01"])
+
+    revenue = q.l_extendedprice * (1 - q.l_discount)
+    promo_revenue = q.p_type.like("PROMO%").ifelse(revenue, 0)
+
+    q = q.aggregate(promo_revenue=100 * promo_revenue.sum() / revenue.sum())
+    return q
+
+
+@pytest.fixture
+def tpc_h15(lineitem, supplier):
+    qrev = lineitem
+    qrev = qrev.filter(
+        [lineitem.l_shipdate >= "1996-01-01", lineitem.l_shipdate < "1996-04-01"]
+    )
+
+    gqrev = qrev.group_by([lineitem.l_suppkey])
+    qrev = gqrev.aggregate(
+        total_revenue=(qrev.l_extendedprice * (1 - qrev.l_discount)).sum()
+    )
+
+    q = supplier.join(qrev, supplier.s_suppkey == qrev.l_suppkey)
+    q = q.filter([q.total_revenue == qrev.total_revenue.max()])
+    q = q.sort_by([q.s_suppkey])
+    q = q[q.s_suppkey, q.s_name, q.s_address, q.s_phone, q.total_revenue]
+    return q
+
+
+@pytest.fixture
+def tpc_h16(partsupp, part, supplier):
+    q = partsupp.join(part, part.p_partkey == partsupp.ps_partkey)
+    q = q.filter(
+        [
+            q.p_brand != "Brand#45",
+            ~q.p_type.like("MEDIUM POLISHED%"),
+            q.p_size.isin((49, 14, 23, 45, 19, 3, 36, 9)),
+            ~q.ps_suppkey.isin(
+                supplier.filter(
+                    [supplier.s_comment.like("%Customer%Complaints%")]
+                ).s_suppkey
+            ),
+        ]
+    )
+    gq = q.groupby([q.p_brand, q.p_type, q.p_size])
+    q = gq.aggregate(supplier_cnt=q.ps_suppkey.nunique())
+    q = q.sort_by([ibis.desc(q.supplier_cnt), q.p_brand, q.p_type, q.p_size])
+    return q
+
+
+@pytest.fixture
+def tpc_h17(lineitem, part):
+    q = lineitem.join(part, part.p_partkey == lineitem.l_partkey)
+
+    innerq = lineitem
+    innerq = innerq.filter([innerq.l_partkey == q.p_partkey])
+
+    q = q.filter(
+        [
+            q.p_brand == "Brand#23",
+            q.p_container == "MED BOX",
+            q.l_quantity < (0.2 * innerq.l_quantity.mean()),
+        ]
+    )
+    q = q.aggregate(avg_yearly=q.l_extendedprice.sum() / 7.0)
+    return q
+
+
+@pytest.fixture
+def tpc_h18(customer, orders, lineitem):
+    subgq = lineitem.groupby([lineitem.l_orderkey])
+    subq = subgq.aggregate(qty_sum=lineitem.l_quantity.sum())
+    subq = subq.filter([subq.qty_sum > 300])
+
+    q = customer
+    q = q.join(orders, customer.c_custkey == orders.o_custkey)
+    q = q.join(lineitem, orders.o_orderkey == lineitem.l_orderkey)
+    q = q.filter([q.o_orderkey.isin(subq.l_orderkey)])
+
+    gq = q.groupby([q.c_name, q.c_custkey, q.o_orderkey, q.o_orderdate, q.o_totalprice])
+    q = gq.aggregate(sum_qty=q.l_quantity.sum())
+    q = q.sort_by([ibis.desc(q.o_totalprice), q.o_orderdate])
+    return q.limit(100)
+
+
+@pytest.fixture
+def tpc_h19(lineitem, part):
+    q = lineitem.join(part, part.p_partkey == lineitem.l_partkey)
+
+    q1 = (
+        (q.p_brand == "Brand#12")
+        & (q.p_container.isin(("SM CASE", "SM BOX", "SM PACK", "SM PKG")))
+        & (q.l_quantity >= 1)
+        & (q.l_quantity <= 1 + 10)
+        & (q.p_size.between(1, 5))
+        & (q.l_shipmode.isin(("AIR", "AIR REG")))
+        & (q.l_shipinstruct == "DELIVER IN PERSON")
+    )
+
+    q2 = (
+        (q.p_brand == "Brand#23")
+        & (q.p_container.isin(("MED BAG", "MED BOX", "MED PKG", "MED PACK")))
+        & (q.l_quantity >= 10)
+        & (q.l_quantity <= 10 + 10)
+        & (q.p_size.between(1, 10))
+        & (q.l_shipmode.isin(("AIR", "AIR REG")))
+        & (q.l_shipinstruct == "DELIVER IN PERSON")
+    )
+
+    q3 = (
+        (q.p_brand == "Brand#34")
+        & (q.p_container.isin(("LG CASE", "LG BOX", "LG PACK", "LG PKG")))
+        & (q.l_quantity >= 20)
+        & (q.l_quantity <= 20 + 10)
+        & (q.p_size.between(1, 15))
+        & (q.l_shipmode.isin(("AIR", "AIR REG")))
+        & (q.l_shipinstruct == "DELIVER IN PERSON")
+    )
+
+    q = q.filter([q1 | q2 | q3])
+    q = q.aggregate(revenue=(q.l_extendedprice * (1 - q.l_discount)).sum())
+    return q
+
+
+@pytest.fixture
+def tpc_h20(supplier, nation, partsupp, part, lineitem):
+    q1 = supplier.join(nation, supplier.s_nationkey == nation.n_nationkey)
+
+    q3 = part.filter([part.p_name.like("forest%")])
+    q2 = partsupp
+
+    q4 = lineitem.filter(
+        [
+            lineitem.l_partkey == q2.ps_partkey,
+            lineitem.l_suppkey == q2.ps_suppkey,
+            lineitem.l_shipdate >= "1994-01-01",
+            lineitem.l_shipdate < "1995-01-01",
+        ]
+    )
+
+    q2 = q2.filter(
+        [
+            partsupp.ps_partkey.isin(q3.p_partkey),
+            partsupp.ps_availqty > 0.5 * q4.l_quantity.sum(),
+        ]
+    )
+
+    q1 = q1.filter([q1.n_name == "CANADA", q1.s_suppkey.isin(q2.ps_suppkey)])
+
+    q1 = q1[q1.s_name, q1.s_address]
+
+    return q1.sort_by(q1.s_name)
+
+
+@pytest.fixture
+def tpc_h21(supplier, lineitem, orders, nation):
+    L2 = lineitem.view()
+    L3 = lineitem.view()
+
+    q = supplier
+    q = q.join(lineitem, supplier.s_suppkey == lineitem.l_suppkey)
+    q = q.join(orders, orders.o_orderkey == lineitem.l_orderkey)
+    q = q.join(nation, supplier.s_nationkey == nation.n_nationkey)
+    q = q[
+        q.l_orderkey.name("l1_orderkey"),
+        q.o_orderstatus,
+        q.l_receiptdate,
+        q.l_commitdate,
+        q.l_suppkey.name("l1_suppkey"),
+        q.s_name,
+        q.n_name,
+    ]
+    q = q.filter(
+        [
+            q.o_orderstatus == "F",
+            q.l_receiptdate > q.l_commitdate,
+            q.n_name == "SAUDI ARABIA",
+            ((L2.l_orderkey == q.l1_orderkey) & (L2.l_suppkey != q.l1_suppkey)).any(),
+            ~(
+                (
+                    (L3.l_orderkey == q.l1_orderkey)
+                    & (L3.l_suppkey != q.l1_suppkey)
+                    & (L3.l_receiptdate > L3.l_commitdate)
+                ).any()
+            ),
+        ]
+    )
+
+    gq = q.group_by([q.s_name])
+    q = gq.aggregate(numwait=q.count())
+    q = q.sort_by([ibis.desc(q.numwait), q.s_name])
+    return q.limit(100)
+
+
+@pytest.fixture
+def tpc_h22(customer, orders):
+    q = customer.filter(
+        [
+            customer.c_acctbal > 0.00,
+            customer.c_phone.substr(0, 2).isin(
+                ("13", "31", "23", "29", "30", "18", "17")
+            ),
+        ]
+    )
+    q = q.aggregate(avg_bal=customer.c_acctbal.mean())
+
+    custsale = customer.filter(
+        [
+            customer.c_phone.substr(0, 2).isin(
+                ("13", "31", "23", "29", "30", "18", "17")
+            ),
+            customer.c_acctbal > q.avg_bal,
+            ~(orders.o_custkey == customer.c_custkey).any(),
+        ]
+    )
+    custsale = custsale[
+        customer.c_phone.substr(0, 2).name("cntrycode"), customer.c_acctbal
+    ]
+
+    gq = custsale.group_by(custsale.cntrycode)
+    outerq = gq.aggregate(numcust=custsale.count(), totacctbal=custsale.c_acctbal.sum())
+
+    return outerq.sort_by(outerq.cntrycode)
+
+
 @pytest.mark.xfail(
     version.parse("2.1.1") < version.parse(ibis.__version__) <= version.parse("3.0.2"),
     reason="issue with unbounded decimal precision fixed on ibis-master",
 )
-def test_tpch1(tpch1, lineitem, compiler):
-    plan = compiler.compile(tpch1)
+def test_tpch1(tpc_h01, lineitem, compiler):
+    plan = compiler.compile(tpc_h01)
     assert plan.SerializeToString()
 
     (result,) = decompile(plan)
@@ -55,3 +643,130 @@ def test_tpch1(tpch1, lineitem, compiler):
         .sort_by(["l_returnflag", "l_linestatus"])
     )
     assert result.equals(expected)
+
+
+TPC_H = [
+    lazy_fixture("tpc_h01"),
+    pytest.param(
+        lazy_fixture("tpc_h02"),
+        marks=pytest.mark.xfail(
+            raises=KeyError, reason="TableArrayView not implemented"
+        ),
+    ),
+    lazy_fixture("tpc_h03"),
+    pytest.param(
+        lazy_fixture("tpc_h04"),
+        marks=pytest.mark.xfail(
+            raises=KeyError, reason="ExistsSubquery not implemented"
+        ),
+    ),
+    lazy_fixture("tpc_h05"),
+    lazy_fixture("tpc_h06"),
+    pytest.param(
+        lazy_fixture("tpc_h07"),
+        marks=pytest.mark.xfail(
+            raises=NotImplementedError, reason="Self reference (view)"
+        ),
+    ),
+    pytest.param(
+        lazy_fixture("tpc_h08"),
+        marks=pytest.mark.xfail(
+            raises=NotImplementedError, reason="Self reference (view)"
+        ),
+    ),
+    lazy_fixture("tpc_h09"),
+    lazy_fixture("tpc_h10"),
+    lazy_fixture("tpc_h11"),
+    lazy_fixture("tpc_h12"),
+    lazy_fixture("tpc_h13"),
+    pytest.param(
+        lazy_fixture("tpc_h14"),
+        marks=pytest.mark.xfail(
+            raises=TypeError,
+            reason="protobuf error resulting subquery (cannot merge Expression and AggregateFunction)",  # noqa
+        ),
+    ),
+    pytest.param(
+        lazy_fixture("tpc_h15"),
+        marks=pytest.mark.xfail(
+            raises=AssertionError, reason="non-empty child offsets"
+        ),
+    ),
+    pytest.param(
+        lazy_fixture("tpc_h16"),
+        marks=pytest.mark.xfail(
+            raises=TypeError, reason="IntegerColumn is not iterable"
+        ),
+    ),
+    pytest.param(
+        lazy_fixture("tpc_h17"),
+        marks=pytest.mark.xfail(
+            raises=NotImplementedError,
+            reason="ibis.expr.operations.relations.Aggregation",
+        ),
+    ),
+    pytest.param(
+        lazy_fixture("tpc_h18"),
+        marks=pytest.mark.xfail(
+            raises=TypeError, reason="IntegerColumn is not iterable"
+        ),
+    ),
+    lazy_fixture("tpc_h19"),
+    pytest.param(
+        lazy_fixture("tpc_h20"),
+        marks=pytest.mark.xfail(
+            raises=TypeError, reason="IntegerColumn is not iterable"
+        ),
+    ),
+    pytest.param(
+        lazy_fixture("tpc_h21"),
+        marks=pytest.mark.xfail(
+            raises=KeyError, reason="ExistsSubquery not implemented"
+        ),
+    ),
+    pytest.param(
+        lazy_fixture("tpc_h22"),
+        marks=pytest.mark.xfail(
+            raises=KeyError, reason="NotExistsSubquery not implemented"
+        ),
+    ),
+]
+
+
+@pytest.mark.skipif(
+    version.parse(ibis.__version__) <= version.parse("3.0.0"),
+    reason="TPC queries aren't formatted in an ibis 2.x compatible way",
+)
+@pytest.mark.parametrize(
+    "query",
+    TPC_H,
+)
+def test_compile(query, compiler):
+    _ = compiler.compile(query)
+
+
+@pytest.mark.skipif(
+    version.parse(ibis.__version__) <= version.parse("3.0.0"),
+    reason="TPC queries aren't formatted in an ibis 2.x compatible way",
+)
+@pytest.mark.parametrize(
+    "query",
+    TPC_H,
+)
+def test_compile_validate(query, compiler):
+    plan = compiler.compile(query)
+
+    c = Config()
+    # too few field names
+    c.override_diagnostic_level(4003, "error", "info")
+    # function def unavailable, cannot check validity of call
+    c.override_diagnostic_level(6003, "warning", "info")
+    # failed to resolve YAML: unknown url type
+    c.override_diagnostic_level(2002, "warning", "info")  # too few field names
+    # typecast validation rules are net yet implemented
+    c.override_diagnostic_level(1, "warning", "info")  # too few field names
+
+    # check_plan takes substrait Plans as arguments but because of namespacing,
+    # our plan is no longer strictly a substrait.plan_pb2.Plan.
+    # Workaround for now is to send in the bytes which it handles without issue.
+    assert check_plan(plan.SerializeToString(), config=c)