diff --git a/pixi.lock b/pixi.lock index dfa9b1f..084b799 100644 --- a/pixi.lock +++ b/pixi.lock @@ -35,8 +35,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - pypi: https://files.pythonhosted.org/packages/56/13/333b8f421738f149d4fe5e49553bc2a2ab75235486259f689b4b91f96cec/protobuf-6.33.2-cp39-abi3-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda @@ -63,8 +63,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - pypi: https://files.pythonhosted.org/packages/7d/4f/f743761e41d3b2b2566748eb76bbff2b43e14d5fcab694f494a16458b05f/protobuf-6.33.2-cp39-abi3-manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl osx-64: - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda @@ -84,8 +84,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - pypi: https://files.pythonhosted.org/packages/b2/ca/7e485da88ba45c920fb3f50ae78de29ab925d9e54ef0de678306abfbb497/protobuf-6.33.2-cp39-abi3-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl osx-arm64: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda @@ -104,8 +104,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - pypi: https://files.pythonhosted.org/packages/b2/ca/7e485da88ba45c920fb3f50ae78de29ab925d9e54ef0de678306abfbb497/protobuf-6.33.2-cp39-abi3-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda @@ -126,8 +126,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - pypi: https://files.pythonhosted.org/packages/64/20/4d50191997e917ae13ad0a235c8b42d8c1ab9c3e6fd455ca16d416944355/protobuf-6.33.2-cp310-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl dev: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -176,9 +176,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f9/04/98c216967275cd9a3e517dfeeb513ebff3183f1f22da29180c479c749ac8/sqloxide-0.1.56-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/76/e0/5318b6a4cc19122a4aa7b6a7d92cd7106ba5baa5536131d851b47cb50645/substrait_antlr-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/f4/b7901b6db48f38c21ce512122e5f7f3b1bd3d66cec4de0d90fed62c0b994/substrait_antlr-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda @@ -218,9 +218,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/de/77/dd27f6e325537126ba0b142fdce63bde4305681662ac58e8e779e3c87635/sqloxide-0.1.56-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/76/e0/5318b6a4cc19122a4aa7b6a7d92cd7106ba5baa5536131d851b47cb50645/substrait_antlr-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/f4/b7901b6db48f38c21ce512122e5f7f3b1bd3d66cec4de0d90fed62c0b994/substrait_antlr-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl osx-64: - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda @@ -253,9 +253,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/10/c7/79f57728f300079148ac4e4b988000dcbd1f58960040db89594424a58336/sqloxide-0.1.56.tar.gz - - pypi: https://files.pythonhosted.org/packages/76/e0/5318b6a4cc19122a4aa7b6a7d92cd7106ba5baa5536131d851b47cb50645/substrait_antlr-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/f4/b7901b6db48f38c21ce512122e5f7f3b1bd3d66cec4de0d90fed62c0b994/substrait_antlr-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl osx-arm64: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda @@ -287,9 +287,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/94/fd/268d58f8feb4d206d2896dae5e8a4a17c671c9cbb6b15c6e6300d2e168a2/sqloxide-0.1.56-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/76/e0/5318b6a4cc19122a4aa7b6a7d92cd7106ba5baa5536131d851b47cb50645/substrait_antlr-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/f4/b7901b6db48f38c21ce512122e5f7f3b1bd3d66cec4de0d90fed62c0b994/substrait_antlr-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda @@ -324,9 +324,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c8/5c/487e081a5ac1a8538f7eb3a3e3ea04c39da13acde1f17916ca1767d40c4e/sqloxide-0.1.56-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/76/e0/5318b6a4cc19122a4aa7b6a7d92cd7106ba5baa5536131d851b47cb50645/substrait_antlr-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/f4/b7901b6db48f38c21ce512122e5f7f3b1bd3d66cec4de0d90fed62c0b994/substrait_antlr-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl extensions: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -364,9 +364,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/89/03/a851e84fcbb85214dc637b6378121ef9a0dd61b4c65264675d8a5c9b1ae7/antlr4_python3_runtime-4.13.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/13/333b8f421738f149d4fe5e49553bc2a2ab75235486259f689b4b91f96cec/protobuf-6.33.2-cp39-abi3-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/76/e0/5318b6a4cc19122a4aa7b6a7d92cd7106ba5baa5536131d851b47cb50645/substrait_antlr-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/f4/b7901b6db48f38c21ce512122e5f7f3b1bd3d66cec4de0d90fed62c0b994/substrait_antlr-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda @@ -395,9 +395,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/89/03/a851e84fcbb85214dc637b6378121ef9a0dd61b4c65264675d8a5c9b1ae7/antlr4_python3_runtime-4.13.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7d/4f/f743761e41d3b2b2566748eb76bbff2b43e14d5fcab694f494a16458b05f/protobuf-6.33.2-cp39-abi3-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/76/e0/5318b6a4cc19122a4aa7b6a7d92cd7106ba5baa5536131d851b47cb50645/substrait_antlr-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/f4/b7901b6db48f38c21ce512122e5f7f3b1bd3d66cec4de0d90fed62c0b994/substrait_antlr-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl osx-64: - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda @@ -419,9 +419,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/89/03/a851e84fcbb85214dc637b6378121ef9a0dd61b4c65264675d8a5c9b1ae7/antlr4_python3_runtime-4.13.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/ca/7e485da88ba45c920fb3f50ae78de29ab925d9e54ef0de678306abfbb497/protobuf-6.33.2-cp39-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/76/e0/5318b6a4cc19122a4aa7b6a7d92cd7106ba5baa5536131d851b47cb50645/substrait_antlr-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/f4/b7901b6db48f38c21ce512122e5f7f3b1bd3d66cec4de0d90fed62c0b994/substrait_antlr-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl osx-arm64: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda @@ -442,9 +442,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/89/03/a851e84fcbb85214dc637b6378121ef9a0dd61b4c65264675d8a5c9b1ae7/antlr4_python3_runtime-4.13.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/ca/7e485da88ba45c920fb3f50ae78de29ab925d9e54ef0de678306abfbb497/protobuf-6.33.2-cp39-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/76/e0/5318b6a4cc19122a4aa7b6a7d92cd7106ba5baa5536131d851b47cb50645/substrait_antlr-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/f4/b7901b6db48f38c21ce512122e5f7f3b1bd3d66cec4de0d90fed62c0b994/substrait_antlr-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda @@ -467,9 +467,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/89/03/a851e84fcbb85214dc637b6378121ef9a0dd61b4c65264675d8a5c9b1ae7/antlr4_python3_runtime-4.13.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/20/4d50191997e917ae13ad0a235c8b42d8c1ab9c3e6fd455ca16d416944355/protobuf-6.33.2-cp310-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/76/e0/5318b6a4cc19122a4aa7b6a7d92cd7106ba5baa5536131d851b47cb50645/substrait_antlr-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/f4/b7901b6db48f38c21ce512122e5f7f3b1bd3d66cec4de0d90fed62c0b994/substrait_antlr-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl sql: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -508,8 +508,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/27/fb8d7338b4d551900fa3e580acbe7a0cf655d940e164cb5c00ec31961094/orderly_set-5.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/13/333b8f421738f149d4fe5e49553bc2a2ab75235486259f689b4b91f96cec/protobuf-6.33.2-cp39-abi3-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f9/04/98c216967275cd9a3e517dfeeb513ebff3183f1f22da29180c479c749ac8/sqloxide-0.1.56-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda @@ -539,8 +539,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/27/fb8d7338b4d551900fa3e580acbe7a0cf655d940e164cb5c00ec31961094/orderly_set-5.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7d/4f/f743761e41d3b2b2566748eb76bbff2b43e14d5fcab694f494a16458b05f/protobuf-6.33.2-cp39-abi3-manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/de/77/dd27f6e325537126ba0b142fdce63bde4305681662ac58e8e779e3c87635/sqloxide-0.1.56-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl osx-64: - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda @@ -563,8 +563,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/27/fb8d7338b4d551900fa3e580acbe7a0cf655d940e164cb5c00ec31961094/orderly_set-5.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/ca/7e485da88ba45c920fb3f50ae78de29ab925d9e54ef0de678306abfbb497/protobuf-6.33.2-cp39-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/10/c7/79f57728f300079148ac4e4b988000dcbd1f58960040db89594424a58336/sqloxide-0.1.56.tar.gz - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl osx-arm64: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda @@ -586,8 +586,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/27/fb8d7338b4d551900fa3e580acbe7a0cf655d940e164cb5c00ec31961094/orderly_set-5.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/ca/7e485da88ba45c920fb3f50ae78de29ab925d9e54ef0de678306abfbb497/protobuf-6.33.2-cp39-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/94/fd/268d58f8feb4d206d2896dae5e8a4a17c671c9cbb6b15c6e6300d2e168a2/sqloxide-0.1.56-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda @@ -611,8 +611,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/27/fb8d7338b4d551900fa3e580acbe7a0cf655d940e164cb5c00ec31961094/orderly_set-5.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/20/4d50191997e917ae13ad0a235c8b42d8c1ab9c3e6fd455ca16d416944355/protobuf-6.33.2-cp310-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c8/5c/487e081a5ac1a8538f7eb3a3e3ea04c39da13acde1f17916ca1767d40c4e/sqloxide-0.1.56-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 @@ -1834,22 +1834,22 @@ packages: version: 0.1.56 sha256: 5e94f9037d7336bef4e3090b15299c2a405c55aba4ae87ef6d963df2f0b48016 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/76/e0/5318b6a4cc19122a4aa7b6a7d92cd7106ba5baa5536131d851b47cb50645/substrait_antlr-0.79.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/84/f4/b7901b6db48f38c21ce512122e5f7f3b1bd3d66cec4de0d90fed62c0b994/substrait_antlr-0.85.0-py3-none-any.whl name: substrait-antlr - version: 0.79.0 - sha256: c2bca78d23049d38c83c51ba360ee32f64e45126cf65bbd457a8f98fe1f8c7e5 + version: 0.85.0 + sha256: f46cbfb15117aab77fd48d8e9a531fa0f79e82b4c20a54a174a97f4511d96396 requires_dist: - antlr4-python3-runtime>=4.13,<5 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl name: substrait-extensions - version: 0.79.0 - sha256: 4ca15d059b912e7e030b4c7a5f0a7c434206c7543f699e5f896caf9cb0b47b65 + version: 0.85.0 + sha256: 4ad8b84411020f75c74e987719bbdaa19d1947ffb3c91b3c707418a0a821b424 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl name: substrait-protobuf - version: 0.79.0 - sha256: 6f710459569be0b92661e16a2d180a9f2a03853c3ef0154a0c6c8a9aef365ffa + version: 0.85.0 + sha256: aff4cb74a0dbab35be11d373fc381d53957f2e97d17158c2c3ce68cdf57498e8 requires_dist: - protobuf>=5,<7 requires_python: '>=3.10' diff --git a/pyproject.toml b/pyproject.toml index feab8f2..f0c8137 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,8 +7,8 @@ readme = "README.md" requires-python = ">=3.10,<3.15" dependencies = [ "protobuf >=5,<7", - "substrait-protobuf==0.79.0", - "substrait-extensions==0.79.0", + "substrait-protobuf==0.85.0", + "substrait-extensions==0.85.0", ] dynamic = ["version"] @@ -16,11 +16,11 @@ dynamic = ["version"] write_to = "src/substrait/_version.py" [project.optional-dependencies] -extensions = ["antlr4-python3-runtime", "substrait-antlr==0.79.0", "pyyaml"] +extensions = ["antlr4-python3-runtime", "substrait-antlr==0.85.0", "pyyaml"] sql = ["sqloxide; python_version < '3.14'", "deepdiff"] [dependency-groups] -dev = ["pytest >= 7.0.0", "antlr4-python3-runtime", "substrait-antlr==0.79.0", "pyyaml", "sqloxide; python_version < '3.14'", "deepdiff", "duckdb<=1.2.2; python_version < '3.14'", "datafusion"] +dev = ["pytest >= 7.0.0", "antlr4-python3-runtime", "substrait-antlr==0.85.0", "pyyaml", "sqloxide; python_version < '3.14'", "deepdiff", "duckdb<=1.2.2; python_version < '3.14'", "datafusion"] [tool.pytest.ini_options] pythonpath = "src" diff --git a/src/substrait/bimap.py b/src/substrait/bimap.py deleted file mode 100644 index 7bf0c0a..0000000 --- a/src/substrait/bimap.py +++ /dev/null @@ -1,102 +0,0 @@ -""" -Bidirectional map for URI <-> URN conversion during the migration period. - -This module provides a UriUrnBiDiMap class that maintains a bidirectional mapping -between URIs and URNs. - -NOTE: This file is temporary and can be removed once the URI -> URN migration -is complete across all Substrait implementations. At that point, only URN-based -extension references will be used. -""" - -from typing import Optional - - -class UriUrnBiDiMap: - """Bidirectional map for URI <-> URN mappings. - - Maintains two internal dictionaries to enable O(1) lookups in both directions. - Enforces that each URI maps to exactly one URN and vice versa. - """ - - def __init__(self): - self._uri_to_urn: dict[str, str] = {} - self._urn_to_uri: dict[str, str] = {} - - def put(self, uri: str, urn: str) -> None: - """Add a bidirectional URI <-> URN mapping. - - Args: - uri: The extension URI (e.g., "https://github.com/.../functions_arithmetic.yaml") - urn: The extension URN (e.g., "extension:io.substrait:functions_arithmetic") - - Raises: - ValueError: If the URI or URN already exists with a different mapping - """ - # Check for conflicts - if self.contains_uri(uri): - existing_urn = self.get_urn(uri) - if existing_urn != urn: - raise ValueError( - f"URI '{uri}' is already mapped to URN '{existing_urn}', " - f"cannot remap to '{urn}'" - ) - # Already have this exact mapping, nothing to do - return - - if self.contains_urn(urn): - existing_uri = self.get_uri(urn) - if existing_uri != uri: - raise ValueError( - f"URN '{urn}' is already mapped to URI '{existing_uri}', " - f"cannot remap to '{uri}'" - ) - # Already have this exact mapping, nothing to do - return - - self._uri_to_urn[uri] = urn - self._urn_to_uri[urn] = uri - - def get_urn(self, uri: str) -> Optional[str]: - """Convert a URI to its corresponding URN. - - Args: - uri: The extension URI to look up - - Returns: - The corresponding URN, or None if the URI is not in the map - """ - return self._uri_to_urn.get(uri) - - def get_uri(self, urn: str) -> Optional[str]: - """Convert a URN to its corresponding URI. - - Args: - urn: The extension URN to look up - - Returns: - The corresponding URI, or None if the URN is not in the map - """ - return self._urn_to_uri.get(urn) - - def contains_uri(self, uri: str) -> bool: - """Check if a URI exists in the map. - - Args: - uri: The URI to check - - Returns: - True if the URI is in the map, False otherwise - """ - return uri in self._uri_to_urn - - def contains_urn(self, urn: str) -> bool: - """Check if a URN exists in the map. - - Args: - urn: The URN to check - - Returns: - True if the URN is in the map, False otherwise - """ - return urn in self._urn_to_uri diff --git a/src/substrait/builders/extended_expression.py b/src/substrait/builders/extended_expression.py index 23059b1..26c7f10 100644 --- a/src/substrait/builders/extended_expression.py +++ b/src/substrait/builders/extended_expression.py @@ -11,7 +11,6 @@ from substrait.type_inference import infer_extended_expression_schema from substrait.utils import ( merge_extension_declarations, - merge_extension_uris, merge_extension_urns, type_num_names, ) @@ -238,23 +237,10 @@ def resolve( ) ] - # Create URI extension for backwards compatibility during URI -> URN migration - uri = registry._uri_urn_bimap.get_uri(urn) - func_extension_uris = [] - if uri: - uri_anchor = registry.lookup_uri_anchor(uri) - if uri_anchor: - func_extension_uris = [ - ste.SimpleExtensionURI(extension_uri_anchor=uri_anchor, uri=uri) - ] - func_extensions = [ ste.SimpleExtensionDeclaration( extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( extension_urn_reference=registry.lookup_urn(urn), - extension_uri_reference=registry.lookup_uri_anchor(uri) - if uri - else 0, function_anchor=func[0].anchor, name=str(func[0]), ) @@ -265,10 +251,6 @@ def resolve( func_extension_urns, *[b.extension_urns for b in bound_expressions] ) - extension_uris = merge_extension_uris( - func_extension_uris, *[b.extension_uris for b in bound_expressions] - ) - extensions = merge_extension_declarations( func_extensions, *[b.extensions for b in bound_expressions] ) @@ -297,7 +279,6 @@ def resolve( ], base_schema=base_schema, extension_urns=extension_urns, - extension_uris=extension_uris, extensions=extensions, ) @@ -336,23 +317,10 @@ def resolve( ) ] - # Create URI extension for backwards compatibility during URI -> URN migration - uri = registry._uri_urn_bimap.get_uri(urn) - func_extension_uris = [] - if uri: - uri_anchor = registry.lookup_uri_anchor(uri) - if uri_anchor: - func_extension_uris = [ - ste.SimpleExtensionURI(extension_uri_anchor=uri_anchor, uri=uri) - ] - func_extensions = [ ste.SimpleExtensionDeclaration( extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( extension_urn_reference=registry.lookup_urn(urn), - extension_uri_reference=registry.lookup_uri_anchor(uri) - if uri - else 0, function_anchor=func[0].anchor, name=str(func[0]), ) @@ -363,10 +331,6 @@ def resolve( func_extension_urns, *[b.extension_urns for b in bound_expressions] ) - extension_uris = merge_extension_uris( - func_extension_uris, *[b.extension_uris for b in bound_expressions] - ) - extensions = merge_extension_declarations( func_extensions, *[b.extensions for b in bound_expressions] ) @@ -391,7 +355,6 @@ def resolve( ], base_schema=base_schema, extension_urns=extension_urns, - extension_uris=extension_uris, extensions=extensions, ) @@ -436,23 +399,10 @@ def resolve( ) ] - # Create URI extension for backwards compatibility during URI -> URN migration - uri = registry._uri_urn_bimap.get_uri(urn) - func_extension_uris = [] - if uri: - uri_anchor = registry.lookup_uri_anchor(uri) - if uri_anchor: - func_extension_uris = [ - ste.SimpleExtensionURI(extension_uri_anchor=uri_anchor, uri=uri) - ] - func_extensions = [ ste.SimpleExtensionDeclaration( extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( extension_urn_reference=registry.lookup_urn(urn), - extension_uri_reference=registry.lookup_uri_anchor(uri) - if uri - else 0, function_anchor=func[0].anchor, name=str(func[0]), ) @@ -465,12 +415,6 @@ def resolve( *[b.extension_urns for b in bound_partitions], ) - extension_uris = merge_extension_uris( - func_extension_uris, - *[b.extension_uris for b in bound_expressions], - *[b.extension_uris for b in bound_partitions], - ) - extensions = merge_extension_declarations( func_extensions, *[b.extensions for b in bound_expressions], @@ -504,7 +448,6 @@ def resolve( ], base_schema=base_schema, extension_urns=extension_urns, - extension_uris=extension_uris, extensions=extensions, ) @@ -531,12 +474,6 @@ def resolve( bound_else = resolve_expression(_else, base_schema, registry) - extension_uris = merge_extension_uris( - *[b[0].extension_uris for b in bound_ifs], - *[b[1].extension_uris for b in bound_ifs], - bound_else.extension_uris, - ) - extension_urns = merge_extension_urns( *[b[0].extension_urns for b in bound_ifs], *[b[1].extension_urns for b in bound_ifs], @@ -588,7 +525,6 @@ def resolve( ) ], base_schema=base_schema, - extension_uris=extension_uris, extension_urns=extension_urns, extensions=extensions, ) @@ -616,12 +552,6 @@ def resolve( ] bound_else = resolve_expression(_else, base_schema, registry) - extension_uris = merge_extension_uris( - bound_match.extension_uris, - *[b.extension_uris for _, b in bound_ifs], - bound_else.extension_uris, - ) - extension_urns = merge_extension_urns( bound_match.extension_urns, *[b.extension_urns for _, b in bound_ifs], @@ -657,7 +587,6 @@ def resolve( ], base_schema=base_schema, extension_urns=extension_urns, - extension_uris=extension_uris, extensions=extensions, ) @@ -675,10 +604,6 @@ def resolve( bound_value = resolve_expression(value, base_schema, registry) bound_options = [resolve_expression(o, base_schema, registry) for o in options] - extension_uris = merge_extension_uris( - bound_value.extension_uris, *[b.extension_uris for b in bound_options] - ) - extension_urns = merge_extension_urns( bound_value.extension_urns, *[b.extension_urns for b in bound_options] ) @@ -705,7 +630,6 @@ def resolve( ], base_schema=base_schema, extension_urns=extension_urns, - extension_uris=extension_uris, extensions=extensions, ) @@ -726,11 +650,6 @@ def resolve( [resolve_expression(e, base_schema, registry) for e in o] for o in options ] - extension_uris = merge_extension_uris( - *[b.extension_uris for b in bound_value], - *[e.extension_uris for b in bound_options for e in b], - ) - extension_urns = merge_extension_urns( *[b.extension_urns for b in bound_value], *[e.extension_urns for b in bound_options for e in b], @@ -762,7 +681,6 @@ def resolve( ], base_schema=base_schema, extension_urns=extension_urns, - extension_uris=extension_uris, extensions=extensions, ) @@ -798,7 +716,6 @@ def resolve( ], base_schema=base_schema, extension_urns=bound_input.extension_urns, - extension_uris=bound_input.extension_uris, extensions=bound_input.extensions, ) diff --git a/src/substrait/builders/plan.py b/src/substrait/builders/plan.py index ff04c13..a2b46d9 100644 --- a/src/substrait/builders/plan.py +++ b/src/substrait/builders/plan.py @@ -22,7 +22,6 @@ from substrait.type_inference import infer_plan_schema from substrait.utils import ( merge_extension_declarations, - merge_extension_uris, merge_extension_urns, ) from substrait.version import substrait_version @@ -47,13 +46,8 @@ def _create_default_version(): def _merge_extensions(*objs): - """Merge extension URIs, URNs, and declarations from multiple plan/expression objects. - - During the URI -> URN migration period, we maintain both URI and URN references - for backwards compatibility. - """ + """Merge extension URNs and declarations from multiple plan/expression objects.""" return { - "extension_uris": merge_extension_uris(*[b.extension_uris for b in objs if b]), "extension_urns": merge_extension_urns(*[b.extension_urns for b in objs if b]), "extensions": merge_extension_declarations(*[b.extensions for b in objs if b]), } diff --git a/src/substrait/extension_registry/registry.py b/src/substrait/extension_registry/registry.py index 1636247..aa0b872 100644 --- a/src/substrait/extension_registry/registry.py +++ b/src/substrait/extension_registry/registry.py @@ -10,13 +10,10 @@ import yaml from substrait.type_pb2 import Type -from substrait.bimap import UriUrnBiDiMap from substrait.simple_extension_utils import build_simple_extensions from .function_entry import FunctionEntry, FunctionType -# Constants -DEFAULT_URN_PREFIX = "https://github.com/substrait-io/substrait/blob/main/extensions" # Format: extension:: # Example: extension:io.substrait:functions_arithmetic URN_PATTERN = re.compile(r"^extension:[^:]+:[^:]+$") @@ -25,47 +22,38 @@ class ExtensionRegistry: def __init__(self, load_default_extensions=True) -> None: self._urn_mapping: dict = defaultdict(dict) # URN -> anchor ID - # NOTE: during the URI -> URN migration, we only need an id generator for URN. We can use the same anchor for plan construction for URIs. self._urn_id_generator = itertools.count(1) self._function_mapping: dict = defaultdict(lambda: defaultdict(list)) self._id_generator = itertools.count(1) - # Bidirectional URI <-> URN mapping (temporary during migration) - self._uri_urn_bimap = UriUrnBiDiMap() if load_default_extensions: for fpath in importlib_files("substrait_extensions.extensions").glob( # type: ignore "functions*.yaml" ): - # Derive URI from DEFAULT_URN_PREFIX and filename - uri = f"{DEFAULT_URN_PREFIX}/{fpath.name}" - self.register_extension_yaml(fpath, uri=uri) + self.register_extension_yaml(fpath) def register_extension_yaml( self, fname: Union[str, Path], - uri: str, ) -> None: """Register extensions from a YAML file. Args: fname: Path to the YAML file - uri: URI for the extension (this is required during the URI -> URN migration) """ fname = Path(fname) with open(fname) as f: # type: ignore extension_definitions = yaml.safe_load(f) - self.register_extension_dict(extension_definitions, uri=uri) + self.register_extension_dict(extension_definitions) - def register_extension_dict(self, definitions: dict, uri: str) -> None: + def register_extension_dict(self, definitions: dict) -> None: """Register extensions from a dictionary (parsed YAML). Args: definitions: The extension definitions dictionary - uri: URI for the extension (for URI/URN bimap) """ unverified_urn = definitions.get("urn") if not unverified_urn: raise ValueError("Extension definitions must contain a 'urn' field") urn = validate_urn_format(unverified_urn) self._urn_mapping[urn] = next(self._urn_id_generator) - self._uri_urn_bimap.put(uri, urn) simple_extensions = build_simple_extensions(definitions) # Helper to register functions by type @@ -150,20 +138,6 @@ def list_functions_across_urns( def lookup_urn(self, urn: str) -> Optional[int]: return self._urn_mapping.get(urn, None) - def lookup_uri_anchor(self, uri: str) -> Optional[int]: - """Look up the anchor ID for a URI. - During the migration period, URI and URN share the same anchor. - This method converts the URI to its URN and returns the URN's anchor. - Args: - uri: The extension URI to look up - Returns: - The anchor ID for the URI (same as its corresponding URN), or None if not found - """ - urn = self._uri_urn_bimap.get_urn(uri) - if urn: - return self._urn_mapping.get(urn) - return None - def validate_urn_format(urn: str) -> str: """Validate that a URN follows the expected format. diff --git a/src/substrait/extension_registry/signature_checker_helpers.py b/src/substrait/extension_registry/signature_checker_helpers.py index 6c498ed..9198840 100644 --- a/src/substrait/extension_registry/signature_checker_helpers.py +++ b/src/substrait/extension_registry/signature_checker_helpers.py @@ -270,6 +270,16 @@ def _handle_parameterized_type( parameters, ) + if isinstance( + parameterized_type, SubstraitTypeParser.PrecisionIntervalCompoundContext + ): + return kind == "interval_compound" and check_integer_type_parameters( + covered.interval_compound, + parameterized_type, + ["precision"], + parameters, + ) + if isinstance(parameterized_type, SubstraitTypeParser.ListContext): return kind == "list" and covers( covered.list.type, diff --git a/src/substrait/proto/__init__.py b/src/substrait/proto/__init__.py index 2c670cf..184dc46 100644 --- a/src/substrait/proto/__init__.py +++ b/src/substrait/proto/__init__.py @@ -1,20 +1,12 @@ # ruff: noqa: F401 F403 import substrait.algebra_pb2 as algebra -import substrait.capabilities_pb2 as capabilities import substrait.extended_expression_pb2 as extended_expression import substrait.extensions.extensions_pb2 as extensions -import substrait.function_pb2 as function -import substrait.parameterized_types_pb2 as parameterized_types import substrait.plan_pb2 as plan -import substrait.type_expressions_pb2 as type_expressions import substrait.type_pb2 as type from substrait.algebra_pb2 import * -from substrait.capabilities_pb2 import * from substrait.extended_expression_pb2 import * from substrait.extensions.extensions_pb2 import * -from substrait.function_pb2 import * -from substrait.parameterized_types_pb2 import * from substrait.plan_pb2 import * -from substrait.type_expressions_pb2 import * from substrait.type_pb2 import * diff --git a/src/substrait/utils/__init__.py b/src/substrait/utils/__init__.py index 2b8508a..3717999 100644 --- a/src/substrait/utils/__init__.py +++ b/src/substrait/utils/__init__.py @@ -38,32 +38,12 @@ def merge_extension_urns(*extension_urns: Iterable[ste.SimpleExtensionURN]): return ret -def merge_extension_uris(*extension_uris: Iterable[ste.SimpleExtensionURI]): - """Merges multiple sets of SimpleExtensionURI objects into a single set. - The order of extensions is kept intact, while duplicates are discarded. - Assumes that there are no collisions (different extensions having identical anchors). - """ - seen_uris = set() - ret = [] - - for uris in extension_uris: - for uri in uris: - if uri.uri not in seen_uris: - seen_uris.add(uri.uri) - ret.append(uri) - - return ret - - def merge_extension_declarations( *extension_declarations: Iterable[ste.SimpleExtensionDeclaration], ): """Merges multiple sets of SimpleExtensionDeclaration objects into a single set. The order of extension declarations is kept intact, while duplicates are discarded. Assumes that there are no collisions (different extension declarations having identical anchors). - - During the URI/URN migration, declarations may have either or both references set. - We deduplicate based on both references and the name without trying to resolve between them. """ seen_extension_functions = set() @@ -74,11 +54,8 @@ def merge_extension_declarations( if declaration.WhichOneof("mapping_type") == "extension_function": ext_func = declaration.extension_function - # Use both URI and URN references as-is in the identifier - # Don't try to resolve or pick between them - just treat them as distinct types ident = ( ext_func.extension_urn_reference, - ext_func.extension_uri_reference, ext_func.name, ) if ident not in seen_extension_functions: diff --git a/tests/builders/extended_expression/test_aggregate_function.py b/tests/builders/extended_expression/test_aggregate_function.py index 3fbd1f3..228bf30 100644 --- a/tests/builders/extended_expression/test_aggregate_function.py +++ b/tests/builders/extended_expression/test_aggregate_function.py @@ -38,9 +38,7 @@ registry = ExtensionRegistry(load_default_extensions=False) -registry.register_extension_dict( - yaml.safe_load(content), uri="https://test.example.com/test.yaml" -) +registry.register_extension_dict(yaml.safe_load(content)) def test_aggregate_count(): @@ -62,16 +60,10 @@ def test_aggregate_count(): extension_urns=[ ste.SimpleExtensionURN(extension_urn_anchor=1, urn="extension:test:urn") ], - extension_uris=[ - ste.SimpleExtensionURI( - extension_uri_anchor=1, uri="https://test.example.com/test.yaml" - ) - ], extensions=[ ste.SimpleExtensionDeclaration( extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( extension_urn_reference=1, - extension_uri_reference=1, function_anchor=1, name="count:any", ) diff --git a/tests/builders/extended_expression/test_cast.py b/tests/builders/extended_expression/test_cast.py index a4d46dc..454b4d7 100644 --- a/tests/builders/extended_expression/test_cast.py +++ b/tests/builders/extended_expression/test_cast.py @@ -66,9 +66,7 @@ def test_cast_with_extension(): - value: i8 return: i8 """ - registry_with_ext.register_extension_dict( - yaml.safe_load(content), uri="https://test.example.com/functions.yaml" - ) + registry_with_ext.register_extension_dict(yaml.safe_load(content)) actual = cast( input=scalar_function( @@ -80,11 +78,6 @@ def test_cast_with_extension(): )(named_struct, registry_with_ext) expected = stee.ExtendedExpression( - extension_uris=[ - ste.SimpleExtensionURI( - extension_uri_anchor=1, uri="https://test.example.com/functions.yaml" - ) - ], extension_urns=[ ste.SimpleExtensionURN( extension_urn_anchor=1, urn="extension:test:functions" @@ -93,7 +86,6 @@ def test_cast_with_extension(): extensions=[ ste.SimpleExtensionDeclaration( extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( - extension_uri_reference=1, extension_urn_reference=1, function_anchor=1, name="add:i8_i8", diff --git a/tests/builders/extended_expression/test_if_then.py b/tests/builders/extended_expression/test_if_then.py index a6b52ec..a11b382 100644 --- a/tests/builders/extended_expression/test_if_then.py +++ b/tests/builders/extended_expression/test_if_then.py @@ -100,10 +100,7 @@ def test_if_then_with_extension(): - value: fp32 return: boolean """ - registry.register_extension_dict( - yaml.safe_load(content), - uri="https://github.com/substrait-io/substrait/blob/main/extensions/functions_comparison.yaml", - ) + registry.register_extension_dict(yaml.safe_load(content)) # Create if_then: if order_total > 100 then "expensive" else "cheap" actual = if_then( @@ -143,12 +140,6 @@ def test_if_then_with_extension(): )(named_struct, registry) expected = stee.ExtendedExpression( - extension_uris=[ - ste.SimpleExtensionURI( - extension_uri_anchor=1, - uri="https://github.com/substrait-io/substrait/blob/main/extensions/functions_comparison.yaml", - ) - ], extension_urns=[ ste.SimpleExtensionURN( extension_urn_anchor=1, @@ -158,7 +149,6 @@ def test_if_then_with_extension(): extensions=[ ste.SimpleExtensionDeclaration( extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( - extension_uri_reference=1, extension_urn_reference=1, function_anchor=1, name="gt:fp32_fp32", diff --git a/tests/builders/extended_expression/test_multi_or_list.py b/tests/builders/extended_expression/test_multi_or_list.py index 8a6a726..ddb1d49 100644 --- a/tests/builders/extended_expression/test_multi_or_list.py +++ b/tests/builders/extended_expression/test_multi_or_list.py @@ -103,9 +103,7 @@ def test_multi_or_list_with_extension(): - value: i8 return: i8 """ - registry_with_ext.register_extension_dict( - yaml.safe_load(content), uri="https://test.example.com/functions.yaml" - ) + registry_with_ext.register_extension_dict(yaml.safe_load(content)) actual = multi_or_list( value=[ @@ -123,11 +121,6 @@ def test_multi_or_list_with_extension(): )(named_struct, registry_with_ext) expected = stee.ExtendedExpression( - extension_uris=[ - ste.SimpleExtensionURI( - extension_uri_anchor=1, uri="https://test.example.com/functions.yaml" - ) - ], extension_urns=[ ste.SimpleExtensionURN( extension_urn_anchor=1, urn="extension:test:functions" @@ -136,7 +129,6 @@ def test_multi_or_list_with_extension(): extensions=[ ste.SimpleExtensionDeclaration( extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( - extension_uri_reference=1, extension_urn_reference=1, function_anchor=1, name="add:i8_i8", diff --git a/tests/builders/extended_expression/test_scalar_function.py b/tests/builders/extended_expression/test_scalar_function.py index 584d7cf..db7c1aa 100644 --- a/tests/builders/extended_expression/test_scalar_function.py +++ b/tests/builders/extended_expression/test_scalar_function.py @@ -41,8 +41,7 @@ registry = ExtensionRegistry(load_default_extensions=False) -test_uri = "https://test.example.com/extension_test_urn.yaml" -registry.register_extension_dict(yaml.safe_load(content), uri=test_uri) +registry.register_extension_dict(yaml.safe_load(content)) def test_sclar_add(): @@ -69,17 +68,10 @@ def test_sclar_add(): extension_urns=[ ste.SimpleExtensionURN(extension_urn_anchor=1, urn="extension:test:urn") ], - extension_uris=[ - ste.SimpleExtensionURI( - extension_uri_anchor=1, - uri="https://test.example.com/extension_test_urn.yaml", - ) - ], extensions=[ ste.SimpleExtensionDeclaration( extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( extension_urn_reference=1, - extension_uri_reference=1, function_anchor=1, name="test_func:i8", ) @@ -151,17 +143,10 @@ def test_nested_scalar_calls(): extension_urns=[ ste.SimpleExtensionURN(extension_urn_anchor=1, urn="extension:test:urn") ], - extension_uris=[ - ste.SimpleExtensionURI( - extension_uri_anchor=1, - uri="https://test.example.com/extension_test_urn.yaml", - ) - ], extensions=[ ste.SimpleExtensionDeclaration( extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( extension_urn_reference=1, - extension_uri_reference=1, function_anchor=2, name="is_positive:i8", ) @@ -169,7 +154,6 @@ def test_nested_scalar_calls(): ste.SimpleExtensionDeclaration( extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( extension_urn_reference=1, - extension_uri_reference=1, function_anchor=1, name="test_func:i8", ) diff --git a/tests/builders/extended_expression/test_singular_or_list.py b/tests/builders/extended_expression/test_singular_or_list.py index b92d12b..84fccb2 100644 --- a/tests/builders/extended_expression/test_singular_or_list.py +++ b/tests/builders/extended_expression/test_singular_or_list.py @@ -72,9 +72,7 @@ def test_singular_or_list_with_extension(): - value: i8 return: i8 """ - registry_with_ext.register_extension_dict( - yaml.safe_load(content), uri="https://test.example.com/functions.yaml" - ) + registry_with_ext.register_extension_dict(yaml.safe_load(content)) actual = singular_or_list( value=scalar_function( @@ -86,11 +84,6 @@ def test_singular_or_list_with_extension(): )(named_struct, registry_with_ext) expected = stee.ExtendedExpression( - extension_uris=[ - ste.SimpleExtensionURI( - extension_uri_anchor=1, uri="https://test.example.com/functions.yaml" - ) - ], extension_urns=[ ste.SimpleExtensionURN( extension_urn_anchor=1, urn="extension:test:functions" @@ -99,7 +92,6 @@ def test_singular_or_list_with_extension(): extensions=[ ste.SimpleExtensionDeclaration( extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( - extension_uri_reference=1, extension_urn_reference=1, function_anchor=1, name="add:i8_i8", diff --git a/tests/builders/extended_expression/test_switch.py b/tests/builders/extended_expression/test_switch.py index 4b92d39..a810d73 100644 --- a/tests/builders/extended_expression/test_switch.py +++ b/tests/builders/extended_expression/test_switch.py @@ -96,9 +96,7 @@ def test_switch_with_extension(): - value: i8 return: i8 """ - registry_with_ext.register_extension_dict( - yaml.safe_load(content), uri="https://test.example.com/functions.yaml" - ) + registry_with_ext.register_extension_dict(yaml.safe_load(content)) actual = switch( match=scalar_function( @@ -114,11 +112,6 @@ def test_switch_with_extension(): )(named_struct, registry_with_ext) expected = stee.ExtendedExpression( - extension_uris=[ - ste.SimpleExtensionURI( - extension_uri_anchor=1, uri="https://test.example.com/functions.yaml" - ) - ], extension_urns=[ ste.SimpleExtensionURN( extension_urn_anchor=1, urn="extension:test:functions" @@ -127,7 +120,6 @@ def test_switch_with_extension(): extensions=[ ste.SimpleExtensionDeclaration( extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( - extension_uri_reference=1, extension_urn_reference=1, function_anchor=1, name="add:i8_i8", diff --git a/tests/builders/extended_expression/test_window_function.py b/tests/builders/extended_expression/test_window_function.py index e60269e..8d17c03 100644 --- a/tests/builders/extended_expression/test_window_function.py +++ b/tests/builders/extended_expression/test_window_function.py @@ -43,9 +43,7 @@ registry = ExtensionRegistry(load_default_extensions=False) -registry.register_extension_dict( - yaml.safe_load(content), uri="https://test.example.com/test.yaml" -) +registry.register_extension_dict(yaml.safe_load(content)) def test_row_number(): @@ -57,16 +55,10 @@ def test_row_number(): extension_urns=[ ste.SimpleExtensionURN(extension_urn_anchor=1, urn="extension:test:urn") ], - extension_uris=[ - ste.SimpleExtensionURI( - extension_uri_anchor=1, uri="https://test.example.com/test.yaml" - ) - ], extensions=[ ste.SimpleExtensionDeclaration( extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( extension_urn_reference=1, - extension_uri_reference=1, function_anchor=1, name="row_number:", ) diff --git a/tests/builders/plan/test_aggregate.py b/tests/builders/plan/test_aggregate.py index 5b802e9..f78218e 100644 --- a/tests/builders/plan/test_aggregate.py +++ b/tests/builders/plan/test_aggregate.py @@ -28,9 +28,7 @@ registry = ExtensionRegistry(load_default_extensions=False) -registry.register_extension_dict( - yaml.safe_load(content), uri="https://test.example.com/test.yaml" -) +registry.register_extension_dict(yaml.safe_load(content)) struct = stt.Type.Struct( types=[i64(nullable=False), boolean()], nullability=stt.Type.NULLABILITY_REQUIRED @@ -61,16 +59,10 @@ def test_aggregate(): extension_urns=[ ste.SimpleExtensionURN(extension_urn_anchor=1, urn="extension:test:urn") ], - extension_uris=[ - ste.SimpleExtensionURI( - extension_uri_anchor=1, uri="https://test.example.com/test.yaml" - ) - ], extensions=[ ste.SimpleExtensionDeclaration( extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( extension_urn_reference=1, - extension_uri_reference=1, function_anchor=1, name="count:any", ) diff --git a/tests/extension_registry/conftest.py b/tests/extension_registry/conftest.py index b6df3cc..b4192c0 100644 --- a/tests/extension_registry/conftest.py +++ b/tests/extension_registry/conftest.py @@ -121,8 +121,5 @@ def registry(): """Create a registry with test functions loaded.""" reg = ExtensionRegistry(load_default_extensions=True) - reg.register_extension_dict( - yaml.safe_load(CONTENT), - uri="https://test.example.com/extension_test_functions.yaml", - ) + reg.register_extension_dict(yaml.safe_load(CONTENT)) return reg diff --git a/tests/extension_registry/test_function_types.py b/tests/extension_registry/test_function_types.py index d4c3f3a..e0725a7 100644 --- a/tests/extension_registry/test_function_types.py +++ b/tests/extension_registry/test_function_types.py @@ -147,10 +147,7 @@ def test_all_function_types_from_yaml(test_case): """Test that all functions in YAML are registered with correct function_type.value.""" test_registry = ExtensionRegistry(load_default_extensions=False) - test_registry.register_extension_dict( - yaml.safe_load(test_case["yaml_content"]), - uri=f"https://test.example.com/{test_case['urn'].replace(':', '_')}.yaml", - ) + test_registry.register_extension_dict(yaml.safe_load(test_case["yaml_content"])) result = test_registry.lookup_function( urn=test_case["urn"], diff --git a/tests/extension_registry/test_type_coverage.py b/tests/extension_registry/test_type_coverage.py index 8ecb550..94ee0e6 100644 --- a/tests/extension_registry/test_type_coverage.py +++ b/tests/extension_registry/test_type_coverage.py @@ -381,7 +381,7 @@ def test_covers_interval_compound(): nullability=Type.NULLABILITY_REQUIRED, precision=6 ) ) - param_ctx = _parse("interval_compound") + param_ctx = _parse("interval_compound<6>") assert covers(covered, param_ctx, {}) @@ -511,16 +511,16 @@ def test_covers_interval_day_with_parameter(): def test_covers_interval_compound_with_precision(): - """Test interval_compound with precision parameter.""" + """Test interval_compound with precision parameter binding.""" covered = Type( interval_compound=Type.IntervalCompound( nullability=Type.NULLABILITY_REQUIRED, precision=9 ) ) - # Note: interval_compound doesn't have a parameterized syntax in the grammar - # so we just test the basic type coverage - param_ctx = _parse("interval_compound") - assert covers(covered, param_ctx, {}) + params: dict = {} + param_ctx = _parse("interval_compound

") + assert covers(covered, param_ctx, params) + assert params["P"] == 9 def test_covers_nested_list(): diff --git a/tests/extension_registry/test_urn_uri_mapping.py b/tests/extension_registry/test_urn_uri_mapping.py deleted file mode 100644 index 3eb5be6..0000000 --- a/tests/extension_registry/test_urn_uri_mapping.py +++ /dev/null @@ -1,176 +0,0 @@ -"""Tests for URN/URI mapping and default extensions.""" - -import yaml - -from substrait.builders.type import i8 -from substrait.extension_registry import ExtensionRegistry - - -def test_registry_uri_urn(): - """Test that URI to URN conversion works via the bimap.""" - urn = "extension:test:bimap" - content_with_urn = f"""%YAML 1.2 ---- -urn: {urn} -scalar_functions: - - name: "test_func" - description: "" - impls: - - args: - - value: i8 - return: i8 -""" - uri = "https://test.example.com/bimap.yaml" - registry = ExtensionRegistry(load_default_extensions=False) - registry.register_extension_dict(yaml.safe_load(content_with_urn), uri=uri) - - assert registry._uri_urn_bimap.get_urn(uri) == urn - assert registry._uri_urn_bimap.get_uri(urn) == uri - - -def test_registry_uri_anchor_lookup(): - """Test that URI anchor lookup works.""" - content_with_urn = """%YAML 1.2 ---- -urn: extension:test:anchor -scalar_functions: [] -""" - uri = "https://test.example.com/anchor.yaml" - registry = ExtensionRegistry(load_default_extensions=False) - registry.register_extension_dict(yaml.safe_load(content_with_urn), uri=uri) - - anchor = registry.lookup_uri_anchor(uri) - assert anchor is not None - assert anchor > 0 - - -def test_registry_default_extensions_have_uri_mappings(): - """Test that default extensions have URI mappings.""" - registry = ExtensionRegistry(load_default_extensions=True) - - # Check that at least one default extension has a URI mapping - urn = "extension:io.substrait:functions_comparison" - uri = registry._uri_urn_bimap.get_uri(urn) - - assert uri is not None - assert "https://github.com/substrait-io/substrait/blob/main/extensions" in uri - assert "functions_comparison.yaml" in uri - - assert registry._uri_urn_bimap.get_urn(uri) == urn - - -def test_registry_default_extensions_lookup_function_multiply(): - """Test that default extensions are loaded and functions can be looked up.""" - registry = ExtensionRegistry(load_default_extensions=True) - - # Test looking up a function from the arithmetic extensions - urn = "extension:io.substrait:functions_arithmetic" - - # Look up a common arithmetic function (e.g., "multiply") - result = registry.lookup_function( - urn=urn, - function_name="multiply", - signature=[i8(nullable=False), i8(nullable=False)], - ) - - assert result is not None, ( - "Failed to lookup 'multiply' function from default extensions" - ) - entry, return_type = result - - # Verify the function entry - assert entry.name == "multiply" - assert entry.urn == urn - assert entry.function_type is not None - assert entry.function_type.value == "scalar" - assert isinstance(entry.anchor, int) - - # Verify the URI-URN mapping exists - uri = registry._uri_urn_bimap.get_uri(urn) - assert uri is not None - assert "https://github.com/substrait-io/substrait/blob/main/extensions" in uri - assert "functions_arithmetic.yaml" in uri - - # Test looking up a function across all URNs without specifying URN - results = registry.list_functions_across_urns( - function_name="multiply", - signature=[i8(nullable=False), i8(nullable=False)], - ) - - assert len(results) > 0, "Failed to find 'multiply' function across all URNs" - - # Verify we found the same function - found_entry = None - for entry, return_type in results: - if entry.urn == urn and entry.name == "multiply": - found_entry = entry - break - - assert found_entry is not None, "multiply function not found in cross-URN search" - assert found_entry.function_type.value == "scalar" - - -def test_registry_default_extensions_lookup_function(): - """Test that default extensions are loaded and functions can be looked up.""" - registry = ExtensionRegistry(load_default_extensions=True) - - # Test looking up a function from the comparison extensions - urn = "extension:io.substrait:functions_comparison" - - # Look up a common comparison function (e.g., "equal") - result = registry.lookup_function( - urn=urn, - function_name="equal", - signature=[i8(nullable=False), i8(nullable=False)], - ) - - assert result is not None, ( - "Failed to lookup 'equal' function from default extensions" - ) - entry, return_type = result - - # Verify the function entry - assert entry.name == "equal" - assert entry.urn == urn - assert entry.function_type is not None - assert entry.function_type.value == "scalar" - assert isinstance(entry.anchor, int) - - # Verify the URI-URN mapping exists - uri = registry._uri_urn_bimap.get_uri(urn) - assert uri is not None - assert "https://github.com/substrait-io/substrait/blob/main/extensions" in uri - assert "functions_comparison.yaml" in uri - - # Test looking up a function across all URNs without specifying URN - results = registry.list_functions_across_urns( - function_name="equal", - signature=[i8(nullable=False), i8(nullable=False)], - ) - - assert len(results) > 0, "Failed to find 'equal' function across all URNs" - - # Verify we found the same function - found_entry = None - for entry, return_type in results: - if entry.urn == urn and entry.name == "equal": - found_entry = entry - break - - assert found_entry is not None, "Equal function not found in cross-URN search" - assert found_entry.function_type.value == "scalar" - - -def test_register_requires_uri(): - """Test that registering requires URI parameter (migration requirement).""" - content = """%YAML 1.2 ---- -urn: extension:test:no_uri -scalar_functions: [] -""" - registry = ExtensionRegistry(load_default_extensions=False) - # This should work fine - URI is required - registry.register_extension_dict( - yaml.safe_load(content), uri="https://test.example.com/test.yaml" - ) - assert registry.lookup_urn("extension:test:no_uri") is not None diff --git a/tests/extension_registry/test_validation.py b/tests/extension_registry/test_validation.py index 1cdd88c..5738dab 100644 --- a/tests/extension_registry/test_validation.py +++ b/tests/extension_registry/test_validation.py @@ -21,9 +21,7 @@ def test_valid_urn_format(): """ registry = ExtensionRegistry(load_default_extensions=False) - registry.register_extension_dict( - yaml.safe_load(content), uri="https://test.example.com/functions_test.yaml" - ) # Should not raise + registry.register_extension_dict(yaml.safe_load(content)) # Should not raise def test_invalid_urn_no_prefix(): @@ -36,9 +34,7 @@ def test_invalid_urn_no_prefix(): registry = ExtensionRegistry(load_default_extensions=False) with pytest.raises(ValueError, match="Invalid URN format"): - registry.register_extension_dict( - yaml.safe_load(content), uri="https://test.example.com/invalid.yaml" - ) + registry.register_extension_dict(yaml.safe_load(content)) def test_invalid_urn_too_short(): @@ -51,9 +47,7 @@ def test_invalid_urn_too_short(): registry = ExtensionRegistry(load_default_extensions=False) with pytest.raises(ValueError, match="Invalid URN format"): - registry.register_extension_dict( - yaml.safe_load(content), uri="https://test.example.com/invalid.yaml" - ) + registry.register_extension_dict(yaml.safe_load(content)) def test_missing_urn(): @@ -65,6 +59,4 @@ def test_missing_urn(): registry = ExtensionRegistry(load_default_extensions=False) with pytest.raises(ValueError, match="must contain a 'urn' field"): - registry.register_extension_dict( - yaml.safe_load(content), uri="https://test.example.com/missing_urn.yaml" - ) + registry.register_extension_dict(yaml.safe_load(content)) diff --git a/tests/test_bimap.py b/tests/test_bimap.py deleted file mode 100644 index c3eef02..0000000 --- a/tests/test_bimap.py +++ /dev/null @@ -1,80 +0,0 @@ -""" -Tests for the UriUrnBiDiMap class. - -This bidirectional map is temporary and used during the URI -> URN migration period. -""" - -import pytest - -from substrait.bimap import UriUrnBiDiMap - - -class TestUriUrnBiDiMap: - """Tests for the UriUrnBiDiMap class.""" - - def test_put_and_get(self): - """Test basic put and get operations.""" - bimap = UriUrnBiDiMap() - uri = "https://github.com/substrait-io/substrait/blob/main/extensions/functions_arithmetic.yaml" - urn = "extension:io.substrait:functions_arithmetic" - - bimap.put(uri, urn) - - assert bimap.get_urn(uri) == urn - assert bimap.get_uri(urn) == uri - - def test_get_nonexistent(self): - """Test getting a non-existent mapping returns None.""" - bimap = UriUrnBiDiMap() - - assert bimap.get_urn("nonexistent") is None - assert bimap.get_uri("nonexistent") is None - - def test_duplicate_uri_same_urn(self): - """Test adding the same URI-URN mapping twice is idempotent.""" - bimap = UriUrnBiDiMap() - uri = "https://example.com/test.yaml" - urn = "extension:example:test" - - bimap.put(uri, urn) - bimap.put(uri, urn) # Should not raise - - assert bimap.get_urn(uri) == urn - - def test_duplicate_uri_different_urn(self): - """Test adding the same URI with different URN raises ValueError.""" - bimap = UriUrnBiDiMap() - uri = "https://example.com/test.yaml" - urn1 = "extension:example:test1" - urn2 = "extension:example:test2" - - bimap.put(uri, urn1) - - with pytest.raises(ValueError, match="already mapped"): - bimap.put(uri, urn2) - - def test_duplicate_urn_different_uri(self): - """Test adding the same URN with different URI raises ValueError.""" - bimap = UriUrnBiDiMap() - uri1 = "https://example.com/test1.yaml" - uri2 = "https://example.com/test2.yaml" - urn = "extension:example:test" - - bimap.put(uri1, urn) - - with pytest.raises(ValueError, match="already mapped"): - bimap.put(uri2, urn) - - def test_contains(self): - """Test contains_uri and contains_urn methods.""" - bimap = UriUrnBiDiMap() - uri = "https://example.com/test.yaml" - urn = "extension:example:test" - - assert not bimap.contains_uri(uri) - assert not bimap.contains_urn(urn) - - bimap.put(uri, urn) - - assert bimap.contains_uri(uri) - assert bimap.contains_urn(urn) diff --git a/tests/test_proto.py b/tests/test_proto.py index 451f1aa..07c3a27 100644 --- a/tests/test_proto.py +++ b/tests/test_proto.py @@ -4,13 +4,9 @@ def test_imports(): """Temporary sanity test""" from substrait.algebra_pb2 import Expression - from substrait.capabilities_pb2 import Capabilities from substrait.extended_expression_pb2 import ExtendedExpression from substrait.extensions.extensions_pb2 import SimpleExtensionURN - from substrait.function_pb2 import FunctionSignature - from substrait.parameterized_types_pb2 import ParameterizedType from substrait.plan_pb2 import Plan - from substrait.type_expressions_pb2 import DerivationExpression from substrait.type_pb2 import Type @@ -21,12 +17,8 @@ def test_proto_proxy_module(): assert {"Plan", "Type", "NamedStruct", "RelRoot"} <= set(dir(substrait.proto)) assert { "algebra", - "capabilities", "extensions", "extended_expression", - "function", - "parameterized_types", "plan", - "type_expressions", "type", } <= set(dir(substrait.proto)) diff --git a/tests/test_uri_urn_migration.py b/tests/test_uri_urn_migration.py deleted file mode 100644 index e646622..0000000 --- a/tests/test_uri_urn_migration.py +++ /dev/null @@ -1,363 +0,0 @@ -""" -test suite for URI <-> URN migration. - -This test set ensures that generated plans from builders contain both uris and urns. - -NOTE: This file is temporary and can be removed once the URI -> URN migration -is complete across all Substrait implementations. -""" - -import substrait.algebra_pb2 as stalg -import substrait.extended_expression_pb2 as stex -import substrait.extensions.extensions_pb2 as ste -import substrait.plan_pb2 as stp -import substrait.type_pb2 as stt -import yaml - -from substrait.builders.extended_expression import ( - aggregate_function, - column, - literal, - scalar_function, -) -from substrait.builders.plan import ( - aggregate, - default_version, - filter, - read_named_table, - select, -) -from substrait.builders.type import i64 -from substrait.extension_registry import ExtensionRegistry -from substrait.type_inference import infer_plan_schema - - -def test_extended_expression_outputs_both_uri_and_urn(): - """Test that scalar_function outputs both SimpleExtensionURI and SimpleExtensionURN.""" - content = """%YAML 1.2 ---- -urn: extension:test:functions -scalar_functions: - - name: "test_func" - description: "" - impls: - - args: - - value: i8 - return: i8 -""" - uri = "https://test.example.com/functions.yaml" - registry = ExtensionRegistry(load_default_extensions=False) - registry.register_extension_dict(yaml.safe_load(content), uri=uri) - - struct = stt.Type.Struct( - types=[stt.Type(i8=stt.Type.I8(nullability=stt.Type.NULLABILITY_REQUIRED))] - ) - named_struct = stt.NamedStruct(names=["value"], struct=struct) - - func_expr = scalar_function( - "extension:test:functions", - "test_func", - expressions=[ - literal( - 10, - type=stt.Type( - i8=stt.Type.I8(nullability=stt.Type.NULLABILITY_REQUIRED) - ), - ) - ], - ) - - actual = func_expr(named_struct, registry) - - expected = stex.ExtendedExpression( - extension_urns=[ - ste.SimpleExtensionURN( - extension_urn_anchor=1, urn="extension:test:functions" - ) - ], - extension_uris=[ste.SimpleExtensionURI(extension_uri_anchor=1, uri=uri)], - extensions=[ - ste.SimpleExtensionDeclaration( - extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( - extension_urn_reference=1, - extension_uri_reference=1, - function_anchor=1, - name="test_func:i8", - ) - ) - ], - referred_expr=[ - stex.ExpressionReference( - expression=stalg.Expression( - scalar_function=stalg.Expression.ScalarFunction( - function_reference=1, - output_type=stt.Type( - i8=stt.Type.I8(nullability=stt.Type.NULLABILITY_REQUIRED) - ), - arguments=[ - stalg.FunctionArgument( - value=stalg.Expression( - literal=stalg.Expression.Literal(i8=10) - ) - ) - ], - ) - ), - output_names=["test_func(Literal(10))"], - ) - ], - base_schema=stt.NamedStruct( - names=["value"], - struct=stt.Type.Struct( - types=[ - stt.Type(i8=stt.Type.I8(nullability=stt.Type.NULLABILITY_REQUIRED)) - ] - ), - ), - ) - - assert actual == expected - - -def test_project_outputs_both_uri_and_urn(): - """Test that project plans with scalar functions have both URI and URN in proto.""" - content = """%YAML 1.2 ---- -urn: extension:test:math -scalar_functions: - - name: "add" - description: "" - impls: - - args: - - value: i64 - - value: i64 - return: i64 -""" - registry = ExtensionRegistry(load_default_extensions=False) - registry.register_extension_dict( - yaml.safe_load(content), uri="https://test.example.com/math.yaml" - ) - - struct = stt.Type.Struct(types=[i64(nullable=False), i64(nullable=False)]) - named_struct = stt.NamedStruct(names=["a", "b"], struct=struct) - - table = read_named_table("table", named_struct) - add_expr = scalar_function( - "extension:test:math", - "add", - expressions=[column("a"), column("b")], - alias=["add"], - ) - - actual = select(table, [add_expr])(registry) - - ns = infer_plan_schema(table(None)) - - expected = stp.Plan( - version=default_version, - extension_urns=[ - ste.SimpleExtensionURN(extension_urn_anchor=1, urn="extension:test:math") - ], - extension_uris=[ - ste.SimpleExtensionURI( - extension_uri_anchor=1, uri="https://test.example.com/math.yaml" - ) - ], - extensions=[ - ste.SimpleExtensionDeclaration( - extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( - extension_urn_reference=1, - extension_uri_reference=1, - function_anchor=1, - name="add:i64_i64", - ) - ) - ], - relations=[ - stp.PlanRel( - root=stalg.RelRoot( - input=stalg.Rel( - project=stalg.ProjectRel( - common=stalg.RelCommon( - emit=stalg.RelCommon.Emit(output_mapping=[2]) - ), - input=table(None).relations[-1].root.input, - expressions=[ - add_expr(ns, registry).referred_expr[0].expression - ], - ) - ), - names=["add"], - ) - ) - ], - ) - - assert actual == expected - - -def test_filter_outputs_both_uri_and_urn(): - """Test that filter plans with scalar functions have both URI and URN in proto.""" - content = """%YAML 1.2 ---- -urn: extension:test:comparison -scalar_functions: - - name: "greater_than" - description: "" - impls: - - args: - - value: i64 - - value: i64 - return: boolean -""" - registry = ExtensionRegistry(load_default_extensions=False) - registry.register_extension_dict( - yaml.safe_load(content), uri="https://test.example.com/comparison.yaml" - ) - - struct = stt.Type.Struct(types=[i64(nullable=False)]) - named_struct = stt.NamedStruct(names=["value"], struct=struct) - - table = read_named_table("table", named_struct) - gt_expr = scalar_function( - "extension:test:comparison", - "greater_than", - expressions=[column("value"), literal(100, i64(nullable=False))], - ) - - actual = filter(table, gt_expr)(registry) - - ns = infer_plan_schema(table(None)) - - expected = stp.Plan( - version=default_version, - extension_urns=[ - ste.SimpleExtensionURN( - extension_urn_anchor=1, urn="extension:test:comparison" - ) - ], - extension_uris=[ - ste.SimpleExtensionURI( - extension_uri_anchor=1, uri="https://test.example.com/comparison.yaml" - ) - ], - extensions=[ - ste.SimpleExtensionDeclaration( - extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( - extension_urn_reference=1, - extension_uri_reference=1, - function_anchor=1, - name="greater_than:i64_i64", - ) - ) - ], - relations=[ - stp.PlanRel( - root=stalg.RelRoot( - input=stalg.Rel( - filter=stalg.FilterRel( - input=table(None).relations[-1].root.input, - condition=gt_expr(ns, registry).referred_expr[0].expression, - ) - ), - names=["value"], - ) - ) - ], - ) - - assert actual == expected - - -def test_aggregate_with_aggregate_function(): - """Test that aggregate plans with aggregate functions have both URI and URN in proto.""" - content = """%YAML 1.2 ---- -urn: extension:test:aggregate -aggregate_functions: - - name: "sum" - description: "" - impls: - - args: - - value: i64 - nullability: DECLARED_OUTPUT - decomposable: MANY - intermediate: i64 - return: i64 -""" - registry = ExtensionRegistry(load_default_extensions=False) - registry.register_extension_dict( - yaml.safe_load(content), uri="https://test.example.com/aggregate.yaml" - ) - - struct = stt.Type.Struct(types=[i64(nullable=False), i64(nullable=False)]) - named_struct = stt.NamedStruct(names=["id", "value"], struct=struct) - - table = read_named_table("table", named_struct) - sum_expr = aggregate_function( - "extension:test:aggregate", "sum", expressions=[column("value")], alias=["sum"] - ) - - actual = aggregate(table, grouping_expressions=[column("id")], measures=[sum_expr])( - registry - ) - - ns = infer_plan_schema(table(None)) - - expected = stp.Plan( - version=default_version, - extension_urns=[ - ste.SimpleExtensionURN( - extension_urn_anchor=1, urn="extension:test:aggregate" - ) - ], - extension_uris=[ - ste.SimpleExtensionURI( - extension_uri_anchor=1, uri="https://test.example.com/aggregate.yaml" - ) - ], - extensions=[ - ste.SimpleExtensionDeclaration( - extension_function=ste.SimpleExtensionDeclaration.ExtensionFunction( - extension_urn_reference=1, - extension_uri_reference=1, - function_anchor=1, - name="sum:i64", - ) - ) - ], - relations=[ - stp.PlanRel( - root=stalg.RelRoot( - input=stalg.Rel( - aggregate=stalg.AggregateRel( - input=table(None).relations[-1].root.input, - grouping_expressions=[ - column("id")(ns, registry).referred_expr[0].expression - ], - groupings=[ - stalg.AggregateRel.Grouping( - grouping_expressions=[ - column("id")(ns, registry) - .referred_expr[0] - .expression - ], - expression_references=[0], - ) - ], - measures=[ - stalg.AggregateRel.Measure( - measure=sum_expr(ns, registry) - .referred_expr[0] - .measure - ) - ], - ) - ), - names=["id", "sum"], - ) - ) - ], - ) - - assert actual == expected diff --git a/tests/test_utils.py b/tests/test_utils.py index ea9374e..002aa7a 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,7 +1,7 @@ import substrait.extensions.extensions_pb2 as ste import substrait.type_pb2 as stt -from substrait.utils import merge_extension_uris, merge_extension_urns, type_num_names +from substrait.utils import merge_extension_urns, type_num_names def test_type_num_names_flat_struct(): @@ -90,26 +90,6 @@ def test_type_num_names_nested_list(): ) -def test_merge_extension_uris_deduplicates(): - """Test that merging extension URIs deduplicates correctly.""" - # Create duplicate URI extensions - uri1 = ste.SimpleExtensionURI( - extension_uri_anchor=1, uri="https://example.com/test.yaml" - ) - uri2 = ste.SimpleExtensionURI( - extension_uri_anchor=1, uri="https://example.com/test.yaml" - ) - uri3 = ste.SimpleExtensionURI( - extension_uri_anchor=2, uri="https://example.com/other.yaml" - ) - - merged_uris = merge_extension_uris([uri1], [uri2, uri3]) - - assert len(merged_uris) == 2 - assert merged_uris[0].uri == "https://example.com/test.yaml" - assert merged_uris[1].uri == "https://example.com/other.yaml" - - def test_merge_extension_urns_deduplicates(): """Test that merging extension URNs deduplicates correctly.""" # Create duplicate URN extensions diff --git a/uv.lock b/uv.lock index edbbd4b..3610fbf 100644 --- a/uv.lock +++ b/uv.lock @@ -371,9 +371,9 @@ requires-dist = [ { name = "protobuf", specifier = ">=5,<7" }, { name = "pyyaml", marker = "extra == 'extensions'" }, { name = "sqloxide", marker = "python_full_version < '3.14' and extra == 'sql'" }, - { name = "substrait-antlr", marker = "extra == 'extensions'", specifier = "==0.79.0" }, - { name = "substrait-extensions", specifier = "==0.79.0" }, - { name = "substrait-protobuf", specifier = "==0.79.0" }, + { name = "substrait-antlr", marker = "extra == 'extensions'", specifier = "==0.85.0" }, + { name = "substrait-extensions", specifier = "==0.85.0" }, + { name = "substrait-protobuf", specifier = "==0.85.0" }, ] provides-extras = ["extensions", "sql"] @@ -386,40 +386,40 @@ dev = [ { name = "pytest", specifier = ">=7.0.0" }, { name = "pyyaml" }, { name = "sqloxide", marker = "python_full_version < '3.14'" }, - { name = "substrait-antlr", specifier = "==0.79.0" }, + { name = "substrait-antlr", specifier = "==0.85.0" }, ] [[package]] name = "substrait-antlr" -version = "0.79.0" +version = "0.85.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "antlr4-python3-runtime" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e4/ad/ed433ae08b5d9c97aeeea876ddc85cf724e80e3163b94873bf237916881c/substrait_antlr-0.79.0.tar.gz", hash = "sha256:fa745258a3d00a9e09a44078b0dca49dd58e2917bc5cc0db0134e76c38b0074f", size = 61302, upload-time = "2026-03-03T15:55:09.652Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/d8/a48ab657b622d089e965aca98599b8f815285ef9771a0615ec35031b32d5/substrait_antlr-0.85.0.tar.gz", hash = "sha256:caf7197e065f9d50b51e8aca6607abd24219ce82dbf4e5a5f70eb711388436c2", size = 63471, upload-time = "2026-03-17T19:19:18.961Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/e0/5318b6a4cc19122a4aa7b6a7d92cd7106ba5baa5536131d851b47cb50645/substrait_antlr-0.79.0-py3-none-any.whl", hash = "sha256:c2bca78d23049d38c83c51ba360ee32f64e45126cf65bbd457a8f98fe1f8c7e5", size = 70703, upload-time = "2026-03-03T15:55:08.735Z" }, + { url = "https://files.pythonhosted.org/packages/84/f4/b7901b6db48f38c21ce512122e5f7f3b1bd3d66cec4de0d90fed62c0b994/substrait_antlr-0.85.0-py3-none-any.whl", hash = "sha256:f46cbfb15117aab77fd48d8e9a531fa0f79e82b4c20a54a174a97f4511d96396", size = 72954, upload-time = "2026-03-17T19:19:20.121Z" }, ] [[package]] name = "substrait-extensions" -version = "0.79.0" +version = "0.85.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/80/d8c822bc2a70026beb80eff121c2dd1160befa2622e4f0a766506b71bba2/substrait_extensions-0.79.0.tar.gz", hash = "sha256:ae295944eb007d5d8243b4e9b818635ee054c6cab224b28e2d45746541b384f2", size = 48636, upload-time = "2026-03-13T17:12:49.411Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/b2/eb2a7a8143d11ff25261ab1c8525386e4b2cbdcd9d282323fe97aac13165/substrait_extensions-0.85.0.tar.gz", hash = "sha256:6b5403b5e7d9cf5f9dbe86f276c6485c9155bec78fab080310202c99b177ca8a", size = 50866, upload-time = "2026-03-17T19:19:18.102Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/2f/a05dd536db76ba9309bb80df559a203614d107ef2381560872fb12370396/substrait_extensions-0.79.0-py3-none-any.whl", hash = "sha256:4ca15d059b912e7e030b4c7a5f0a7c434206c7543f699e5f896caf9cb0b47b65", size = 101699, upload-time = "2026-03-13T17:12:48.505Z" }, + { url = "https://files.pythonhosted.org/packages/64/4a/36d734df05faa310b3ef0a492e47b85b6e082471473266bf355852f87bba/substrait_extensions-0.85.0-py3-none-any.whl", hash = "sha256:4ad8b84411020f75c74e987719bbdaa19d1947ffb3c91b3c707418a0a821b424", size = 105287, upload-time = "2026-03-17T19:19:19.042Z" }, ] [[package]] name = "substrait-protobuf" -version = "0.79.0" +version = "0.85.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/61/8d/0d7ff0e56fdf341182729da4ce5754712ad3b950e0e404ec2fa53f46627b/substrait_protobuf-0.79.0.tar.gz", hash = "sha256:f1bf8641eb3ee785f4affd4f728568958deda2bb1ededa09f02f2118229616d4", size = 74840, upload-time = "2026-01-29T00:08:55.587Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/36/de86485ada792ec97ffb6024efbfd701ddcbe93599dfffc895dd8f21f704/substrait_protobuf-0.85.0.tar.gz", hash = "sha256:e7776181dcb18703a6e27b0291de86c8034a02b5d92e1fc2fc919ced62757570", size = 59062, upload-time = "2026-03-17T19:19:14.018Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/27/24e16471dc7b5986cd2af0d5aab9b12347fb835840fb2320b1b2375e53a8/substrait_protobuf-0.79.0-py3-none-any.whl", hash = "sha256:6f710459569be0b92661e16a2d180a9f2a03853c3ef0154a0c6c8a9aef365ffa", size = 83741, upload-time = "2026-01-29T00:08:54.03Z" }, + { url = "https://files.pythonhosted.org/packages/68/db/20eba8a3cc5a78a53d1439d2067930b998bd842debac5b687a2a27a05dcc/substrait_protobuf-0.85.0-py3-none-any.whl", hash = "sha256:aff4cb74a0dbab35be11d373fc381d53957f2e97d17158c2c3ce68cdf57498e8", size = 64453, upload-time = "2026-03-17T19:19:15.084Z" }, ] [[package]]