From f280c94c237a8446a1b2a089ba988f6378ec5f44 Mon Sep 17 00:00:00 2001 From: Thomas Ubensee <34603111+tomuben@users.noreply.github.com> Date: Fri, 20 Feb 2026 14:43:56 -0300 Subject: [PATCH 1/3] #1369: Added missing tests for Python context --- test_container/tests/test/java/context.py | 134 ++++++++++++++++++ .../tests/test/python3/all/context.py | 105 ++++++++++++++ test_container/tests/test/r/context.py | 106 ++++++++++++++ 3 files changed, 345 insertions(+) create mode 100644 test_container/tests/test/java/context.py create mode 100644 test_container/tests/test/python3/all/context.py create mode 100644 test_container/tests/test/r/context.py diff --git a/test_container/tests/test/java/context.py b/test_container/tests/test/java/context.py new file mode 100644 index 000000000..39f2b73fb --- /dev/null +++ b/test_container/tests/test/java/context.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python3 + +from exasol_python_test_framework import udf + + +NUM_ROW_INSERTS = 15 +PAYLOAD = '0123456789ABCDEF0123456789ABCDEF' + + +class CtxSizeAPITest(udf.TestCase): + def setUp(self): + self.query('DROP SCHEMA context_api CASCADE', ignore_errors=True) + self.query('CREATE SCHEMA context_api') + + self.query(''' + CREATE OR REPLACE TABLE ctx_size_input( + a VARCHAR(32), + i DECIMAL(9,0) + ) + ''') + self.query(f''' + INSERT INTO ctx_size_input VALUES ('{PAYLOAD}', 0) + ''') + self.query(f''' + INSERT INTO ctx_size_input VALUES ('{PAYLOAD}', 1) + ''') + self._duplicate_rows('ctx_size_input', 'a, i') + self.commit() + + def _duplicate_rows(self, table_name, column_names): + for i in range(NUM_ROW_INSERTS): + self.query( + f'INSERT INTO {table_name} ({column_names}) ' + f'SELECT {column_names} FROM {table_name}' + ) + + def test_ctx_size_scalar_udf(self): + self.query(udf.fixindent(''' + CREATE OR REPLACE JAVA SCALAR SCRIPT + SCALAR_CTX_SIZE(a VARCHAR(32)) + RETURNS INTEGER AS + class SCALAR_CTX_SIZE{ + static long run(ExaMetadata exa, ExaIterator ctx) throws Exception { + return ctx.size(); + } + } + / + ''')) + + rows = self.query(''' + SELECT MAX(scalar_ctx_size(a)) + FROM ctx_size_input + ''') + self.assertRowsEqual([(2048,)], rows) + + def test_ctx_size_set_udf(self): + self.query(udf.fixindent(''' + CREATE OR REPLACE JAVA SET SCRIPT + set_ctx_size(a VARCHAR(32), i INTEGER) + RETURNS INTEGER AS + + class SET_CTX_SIZE{ + static long run(ExaMetadata exa, ExaIterator ctx) throws Exception { + return ctx.size(); + } + } + ''')) + + rows = self.query(''' + SELECT set_ctx_size(a, i) + FROM ctx_size_input + GROUP BY i + ''') + self.assertRowsEqual([(32768,), (32768,)], rows) + + +class CtxGetitemAPITest(udf.TestCase): + def setUp(self): + self.query('DROP SCHEMA context_api CASCADE', ignore_errors=True) + self.query('CREATE SCHEMA context_api') + + def test_ctx_get_object_by_name(self): + self.query(''' + CREATE OR REPLACE TABLE t( + "a" VARCHAR(10000) + ) + ''') + self.query(''' + INSERT INTO t VALUES ('x') + ''') + + self.query(udf.fixindent(''' + CREATE OR REPLACE JAVA SCALAR SCRIPT + SCALAR_GET_OBJECT("a" VARCHAR(10000)) + RETURNS VARCHAR(1000) AS + class SCALAR_GET_OBJECT { + static String run(ExaMetadata exa, ExaIterator ctx) throws Exception { + return (String)ctx.getObject("a"); + } + } + + ''')) + + rows = self.query('SELECT SCALAR_GET_OBJECT("a") FROM t') + self.assertRowsEqual([('x',)], rows) + + def test_ctx_get_object_by_index(self): + self.query(''' + CREATE OR REPLACE TABLE t( + "a" VARCHAR(10000) + ) + ''') + self.query(''' + INSERT INTO t + VALUES ('x') + ''') + + self.query(udf.fixindent(''' + CREATE OR REPLACE JAVA SCALAR SCRIPT + SCALAR_GET_OBJECT("a" VARCHAR(10000)) + RETURNS VARCHAR(1000) AS + class SCALAR_GET_OBJECT { + static String run(ExaMetadata exa, ExaIterator ctx) throws Exception { + return (String)ctx.getObject(0); + } + } + + ''')) + + rows = self.query('SELECT SCALAR_GET_OBJECT("a") FROM t') + self.assertRowsEqual([('x',)], rows) + +if __name__ == '__main__': + udf.main() \ No newline at end of file diff --git a/test_container/tests/test/python3/all/context.py b/test_container/tests/test/python3/all/context.py new file mode 100644 index 000000000..c8edf62ce --- /dev/null +++ b/test_container/tests/test/python3/all/context.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python3 + +from exasol_python_test_framework import udf + + +NUM_ROW_INSERTS = 15 +PAYLOAD = '0123456789ABCDEF0123456789ABCDEF' + + +class CtxSizeAPITest(udf.TestCase): + def setUp(self): + self.query('DROP SCHEMA context_api CASCADE', ignore_errors=True) + self.query('CREATE SCHEMA context_api') + + self.query(''' + CREATE OR REPLACE TABLE ctx_size_input( + a VARCHAR(32), + i DECIMAL(9,0) + ) + ''') + self.query(f''' + INSERT INTO ctx_size_input VALUES ('{PAYLOAD}', 0) + ''') + self.query(f''' + INSERT INTO ctx_size_input VALUES ('{PAYLOAD}', 1) + ''') + self._duplicate_rows('ctx_size_input', 'a, i') + self.commit() + + def _duplicate_rows(self, table_name, column_names): + for i in range(NUM_ROW_INSERTS): + self.query( + f'INSERT INTO {table_name} ({column_names}) ' + f'SELECT {column_names} FROM {table_name}' + ) + + def test_ctx_size_scalar_udf(self): + self.query(udf.fixindent(''' + CREATE OR REPLACE PYTHON3 SCALAR SCRIPT + scalar_ctx_size(a VARCHAR(32)) + RETURNS INTEGER AS + + def run(ctx): + return ctx.size() + / + ''')) + + rows = self.query(''' + SELECT MAX(scalar_ctx_size(a)) + FROM ctx_size_input + ''') + self.assertRowsEqual([(2048,)], rows) + + def test_ctx_size_set_udf(self): + self.query(udf.fixindent(''' + CREATE OR REPLACE PYTHON3 SET SCRIPT + set_ctx_size(a VARCHAR(32), i INTEGER) + RETURNS INTEGER AS + + def run(ctx): + return ctx.size() + / + ''')) + + rows = self.query(''' + SELECT set_ctx_size(a, i) + FROM ctx_size_input + GROUP BY i + ''') + self.assertRowsEqual([(32768,), (32768,)], rows) + + +class CtxGetitemAPITest(udf.TestCase): + def setUp(self): + self.query('DROP SCHEMA context_api CASCADE', ignore_errors=True) + self.query('CREATE SCHEMA context_api') + + def test_ctx_getitem_supports_non_identifier_input_names(self): + self.query(''' + CREATE OR REPLACE TABLE t( + "valid_name" INTEGER, + "123col" INTEGER, + "has-hyphen" INTEGER + ) + ''') + self.query(''' + INSERT INTO t VALUES (1, 2, 3) + ''') + + self.query(udf.fixindent(''' + CREATE OR REPLACE PYTHON3 SCALAR SCRIPT + scalar_ctx_getitem("valid_name" INTEGER, "123col" INTEGER, "has-hyphen" INTEGER) + RETURNS INTEGER AS + + def run(ctx): + return ctx.valid_name + ctx["123col"] + ctx["has-hyphen"] + / + ''')) + + rows = self.query('SELECT scalar_ctx_getitem("valid_name", "123col", "has-hyphen") FROM t') + self.assertRowsEqual([(6,)], rows) + + +if __name__ == '__main__': + udf.main() \ No newline at end of file diff --git a/test_container/tests/test/r/context.py b/test_container/tests/test/r/context.py new file mode 100644 index 000000000..670226ef3 --- /dev/null +++ b/test_container/tests/test/r/context.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 + +from exasol_python_test_framework import udf + + +NUM_ROW_INSERTS = 15 +PAYLOAD = '0123456789ABCDEF0123456789ABCDEF' + + +class CtxSizeAPITest(udf.TestCase): + def setUp(self): + self.query('DROP SCHEMA context_api CASCADE', ignore_errors=True) + self.query('CREATE SCHEMA context_api') + + self.query(''' + CREATE OR REPLACE TABLE ctx_size_input( + a VARCHAR(32), + i DECIMAL(9,0) + ) + ''') + self.query(f''' + INSERT INTO ctx_size_input VALUES ('{PAYLOAD}', 0) + ''') + self.query(f''' + INSERT INTO ctx_size_input VALUES ('{PAYLOAD}', 1) + ''') + self._duplicate_rows('ctx_size_input', 'a, i') + self.commit() + + def _duplicate_rows(self, table_name, column_names): + for i in range(NUM_ROW_INSERTS): + self.query( + f'INSERT INTO {table_name} ({column_names}) ' + f'SELECT {column_names} FROM {table_name}' + ) + + def test_ctx_size_scalar_udf(self): + self.query(udf.fixindent(''' + CREATE OR REPLACE R SCALAR SCRIPT + scalar_ctx_size(a VARCHAR(32)) + RETURNS INTEGER AS + + run <- function(ctx) { + ctx$size() + }; + ''')) + + rows = self.query(''' + SELECT MAX(scalar_ctx_size(a)) + FROM ctx_size_input + ''') + self.assertRowsEqual([(2048,)], rows) + + def test_ctx_size_set_udf(self): + self.query(udf.fixindent(''' + CREATE OR REPLACE R SET SCRIPT + set_ctx_size(a VARCHAR(32), i INTEGER) + RETURNS INTEGER AS + + run <- function(ctx) { + ctx$size() + }; + ''')) + + rows = self.query(''' + SELECT set_ctx_size(a, i) + FROM ctx_size_input + GROUP BY i + ''') + self.assertRowsEqual([(32768,), (32768,)], rows) + + +class CtxGetitemAPITest(udf.TestCase): + def setUp(self): + self.query('DROP SCHEMA context_api CASCADE', ignore_errors=True) + self.query('CREATE SCHEMA context_api') + + def test_ctx_getitem_supports_non_identifier_input_names(self): + self.query(''' + CREATE OR REPLACE TABLE t( + "valid_name" INTEGER, + "123col" INTEGER, + "has-hyphen" INTEGER + ) + ''') + self.query(''' + INSERT INTO t VALUES (1, 2, 3) + ''') + + self.query(udf.fixindent(''' + CREATE OR REPLACE R SCALAR SCRIPT + scalar_ctx_getitem("valid_name" INTEGER, "123col" INTEGER, "has-hyphen" INTEGER) + RETURNS INTEGER AS + + run <- function(ctx) { + ctx$valid_name + ctx[["123col"]]() + ctx[["has-hyphen"]]() + }; + + ''')) + + rows = self.query('SELECT scalar_ctx_getitem("valid_name", "123col", "has-hyphen") FROM t') + self.assertRowsEqual([(6,)], rows) + + +if __name__ == '__main__': + udf.main() \ No newline at end of file From ec9f85841e7d1fc978bef0be8b760f4b530568d8 Mon Sep 17 00:00:00 2001 From: Thomas Ubensee <34603111+tomuben@users.noreply.github.com> Date: Mon, 23 Feb 2026 06:51:21 -0300 Subject: [PATCH 2/3] Test From 003a1d7e93146b1c19cfee5437a5b1dcb4e7b5ea Mon Sep 17 00:00:00 2001 From: Thomas Ubensee <34603111+tomuben@users.noreply.github.com> Date: Mon, 23 Feb 2026 07:27:39 -0300 Subject: [PATCH 3/3] Updated R package versions for install package tests --- .../r/versions/with_versions/all_versions_specified | 4 ++-- .../test_files/r/versions/with_versions/some_missing_versions | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/scripts/tests/install_scripts/test_files/r/versions/with_versions/all_versions_specified b/ext/scripts/tests/install_scripts/test_files/r/versions/with_versions/all_versions_specified index 68994cc73..1c408e933 100644 --- a/ext/scripts/tests/install_scripts/test_files/r/versions/with_versions/all_versions_specified +++ b/ext/scripts/tests/install_scripts/test_files/r/versions/with_versions/all_versions_specified @@ -1,3 +1,3 @@ -dplyr|0.8.3 -purrr|0.3.2 +dplyr|1.2.0 +purrr|1.2.1 magrittr|2.0.4 diff --git a/ext/scripts/tests/install_scripts/test_files/r/versions/with_versions/some_missing_versions b/ext/scripts/tests/install_scripts/test_files/r/versions/with_versions/some_missing_versions index bb577453b..0cc7ee936 100644 --- a/ext/scripts/tests/install_scripts/test_files/r/versions/with_versions/some_missing_versions +++ b/ext/scripts/tests/install_scripts/test_files/r/versions/with_versions/some_missing_versions @@ -1,3 +1,3 @@ -dplyr|0.8.3 +dplyr|1.2.0 purrr| magrittr|