From 5a753ed5b319adb431437d89ca92065c148f1019 Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Thu, 28 Aug 2025 12:28:31 +0200 Subject: [PATCH] Update trino-wasm-python to 3.13-4 Migrate to new Chicory APIs for AOT generated Python machine --- plugin/trino-functions-python/pom.xml | 2 +- .../plugin/functions/python/PythonEngine.java | 13 +++++++------ .../functions/python/TestPythonFunctions.java | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/plugin/trino-functions-python/pom.xml b/plugin/trino-functions-python/pom.xml index 29b1f7a61116..acd82dba8d1c 100644 --- a/plugin/trino-functions-python/pom.xml +++ b/plugin/trino-functions-python/pom.xml @@ -75,7 +75,7 @@ io.trino trino-wasm-python - 3.13-3 + 3.13-4 diff --git a/plugin/trino-functions-python/src/main/java/io/trino/plugin/functions/python/PythonEngine.java b/plugin/trino-functions-python/src/main/java/io/trino/plugin/functions/python/PythonEngine.java index 39c94c2a6867..711f63236087 100644 --- a/plugin/trino-functions-python/src/main/java/io/trino/plugin/functions/python/PythonEngine.java +++ b/plugin/trino-functions-python/src/main/java/io/trino/plugin/functions/python/PythonEngine.java @@ -22,6 +22,7 @@ import com.dylibso.chicory.wasi.WasiPreview1; import com.dylibso.chicory.wasm.ChicoryException; import com.dylibso.chicory.wasm.WasmModule; +import com.dylibso.chicory.wasm.types.FunctionType; import com.google.common.collect.ImmutableList; import com.google.common.io.Closer; import com.google.common.jimfs.Configuration; @@ -36,7 +37,8 @@ import io.trino.spi.StandardErrorCode; import io.trino.spi.TrinoException; import io.trino.spi.type.Type; -import io.trino.wasm.python.PythonModule; +import io.trino.wasm.python.Python; +import io.trino.wasm.python.PythonMachine; import java.io.ByteArrayOutputStream; import java.io.Closeable; @@ -50,7 +52,7 @@ import java.util.Map; import java.util.stream.Stream; -import static com.dylibso.chicory.wasm.types.ValueType.I32; +import static com.dylibso.chicory.wasm.types.ValType.I32; import static com.google.common.collect.ImmutableMap.toImmutableMap; import static io.airlift.units.DataSize.Unit.MEGABYTE; import static io.trino.plugin.functions.python.TrinoTypes.binaryToJava; @@ -78,7 +80,7 @@ final class PythonEngine private static final Map ERROR_CODES = Stream.of(StandardErrorCode.values()) .collect(toImmutableMap(error -> error.toErrorCode().getCode(), identity())); - private static final WasmModule PYTHON_MODULE = PythonModule.load(); + private static final WasmModule PYTHON_MODULE = Python.load(); private final Closer closer = Closer.create(); private final LimitedOutputStream stderr = new LimitedOutputStream(); @@ -123,7 +125,7 @@ public PythonEngine(String guestCode) .build(); Instance instance = Instance.builder(PYTHON_MODULE) - .withMachineFactory(PythonModule::create) + .withMachineFactory(PythonMachine::new) .withImportValues(importValues) .build(); @@ -276,8 +278,7 @@ private HostFunction returnErrorHostFunction() return new HostFunction( "trino", "return_error", - List.of(I32, I32, I32, I32, I32), - List.of(), + FunctionType.of(List.of(I32, I32, I32, I32, I32), List.of()), this::returnError); } diff --git a/plugin/trino-functions-python/src/test/java/io/trino/plugin/functions/python/TestPythonFunctions.java b/plugin/trino-functions-python/src/test/java/io/trino/plugin/functions/python/TestPythonFunctions.java index 203feec7f042..100763d50a10 100644 --- a/plugin/trino-functions-python/src/test/java/io/trino/plugin/functions/python/TestPythonFunctions.java +++ b/plugin/trino-functions-python/src/test/java/io/trino/plugin/functions/python/TestPythonFunctions.java @@ -107,6 +107,25 @@ SELECT my_func(nationkey) .matches("VALUES bigint '42'"); } + @Test + public void testImportingAndRunningBleach() + { + assertThat(assertions.query( + """ + WITH FUNCTION sanitize_html(html_input VARCHAR) + RETURNS VARCHAR + LANGUAGE PYTHON + WITH (handler = 'sanitize_html') + AS $$ + import bleach + def sanitize_html(html_input): + return bleach.clean(html_input, tags={'b'}, attributes={}, strip=True) + $$ + SELECT sanitize_html('an example') + """)) + .matches("VALUES varchar 'an example'"); + } + @Test public void testInvalidHandler() {