SCALAR RETURN UDFs with large input and output data may produce wrong results

Details

Detail name Value
Changelog Number 13796
Type Bug
Status Resolved
Affected Versions Exasol 7.0.0, Exasol 7.1.0
Fix Versions Exasol 8.0.0, Exasol 7.0.17, Exasol 7.1.7
Resolution Date 2022-03-15

Description

Queries that use a UDF with large input and output values may produce wrong results under the following conditions:

  • The UDF is a SCALAR RETURN UDF.
  • The UDF language is either Python, Python 3, Java or R.
  • The input data for 4096 rows is larger then 2 MiB.
  • The output data for 4096 rows is larger then 2 MiB.

Lua UDFs are not affected.

Preparation

--/
CREATE OR REPLACE PYTHON3 SCALAR SCRIPT python3_script (x varchar(10000)) RETURNS varchar(10000) AS
def run(ctx):
        return ctx.x
/

CREATE OR REPLACE TABLE basis(a int);
INSERT INTO basis VALUES 0,1,2,3,4,5,6,7,8,9;
CREATE OR REPLACE TABLE t(id int, v4096 VARCHAR(10000));
INSERT INTO t(id) select rownum from (select a.a from basis a, basis, basis, basis);
UPDATE t SET v4096 = REPEAT(CAST(HASH_SHA512(id) as VARCHAR(10000)), 32);

Example

-- Every result != 0 is wrong
SELECT COUNT(*) FROM (SELECT id, v4096, python3_script(v4096) as e_col FROM t) WHERE v4096 != e_col;

Workaround

Use a scalar emits function.

Example

CREATE OR REPLACE PYTHON3 SCALAR SCRIPT python3_emits_script (x varchar(10000)) EMITS (e_col varchar(10000)) AS
def run(ctx):
        ctx.emit(ctx.x)
/

SELECT COUNT(*) FROM (SELECT id, v4096, python3_emits_script(v4096) FROM t) WHERE v4096 != e_col;

Fix

In the above scenario, UDFs return the correct results.