[
https://issues.apache.org/jira/browse/TRAFODION-2912?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16344282#comment-16344282
]
ASF GitHub Bot commented on TRAFODION-2912:
-------------------------------------------
Github user zellerh commented on a diff in the pull request:
https://github.com/apache/trafodion/pull/1420#discussion_r164610617
--- Diff: core/sql/regress/udr/EXPECTED103 ---
@@ -396,6 +458,68 @@ CREATE LIBRARY TRAFODION.UDR103SCH.FUNCTIONSFORTEST103
FILE '/mnt2/ansharma/ansh
+> library functionsForTest103
+> deterministic no sql final call allow any parallelism state area size
1024 ;
+--- SQL operation complete.
+>>
+>>create function nonDeterministicRandom
++> () returns (r integer)
++> language c parameter style sql external name 'nonDeterministicRandom'
++> library functionsForTest103
++> not deterministic no sql final call allow any parallelism state area
size 1024 ;
+
+--- SQL operation complete.
+>>
+>>cqd nested_joins 'off';
+
+--- SQL operation complete.
+>>cqd merge_joins 'off';
+
+--- SQL operation complete.
+>>cqd join_order_by_user 'on';
+
+--- SQL operation complete.
+>>prepare s from
++>select a, nonDeterministicRandom() r1,
++> generateRandomNumber(a, 4) r2, generateRandomNumber(123, 4) r3
++>from (values (1), (2), (3)) T(a);
+
+--- SQL command prepared.
+>>explain options 'f' s;
--- End diff --
Yes, I was concerned about that as well and I saw different join orders.
For that reason I used a bunch of CQDs - HJ, MJ off and JOBU, to prevent random
plan changes.
> Non-deterministic scalar UDFs not executed once per row
> -------------------------------------------------------
>
> Key: TRAFODION-2912
> URL: https://issues.apache.org/jira/browse/TRAFODION-2912
> Project: Apache Trafodion
> Issue Type: Bug
> Components: sql-cmp
> Affects Versions: 2.0-incubating
> Reporter: Hans Zeller
> Assignee: Hans Zeller
> Priority: Major
> Fix For: 2.3
>
>
> This problem was found by Andy Yang.
> Andy created a random generator scalar UDF and found that it did not return a
> different random value for each row:
> {noformat}
> >>select scalar_rand_udf(), scalar_rand_udf()
> +>from (values (1), (2), (3)) T(s);
> RND RND
> ----------- -----------
> 846930886 1804289383
> 846930886 1804289383
> 846930886 1804289383
> --- 3 row(s) selected.
> >>
> {noformat}
> Here is the explain, it shows that we are using hash joins, not nested joins,
> to evaluate the UDFs:
> {noformat}
> >>explain options 'f' s;
> LC RC OP OPERATOR OPT DESCRIPTION CARD
> ---- ---- ---- -------------------- -------- -------------------- ---------
> 5 . 6 root 3.00E+000
> 4 1 5 hybrid_hash_join 3.00E+000
> 3 2 4 hybrid_hash_join 1.00E+000
> . . 3 isolated_scalar_udf SCALAR_RAND_UDF 1.00E+000
> . . 2 isolated_scalar_udf SCALAR_RAND_UDF 1.00E+000
> . . 1 tuplelist 3.00E+000
> --- SQL operation complete.
> >>
> {noformat}
> The problem is that we don't check for non-deterministic UDFs when we
> transform a TSJ to a regular join in the transformer or normalizer. We don't
> even set the non-deterministic flag in the group attributes of the
> IsolatedScalarUDF node.
> The fix is to set this flag correctly and to add a check and not transform
> routine joins for non-deterministic isolated scalar UDFs into a regular join.
> To recreate:
> Here is the source code of the UDF:
> {noformat}
> #include "sqludr.h"
> #include <stdlib.h>
> SQLUDR_LIBFUNC SQLUDR_INT32 scalar_rand_udf(SQLUDR_INT32 *out1,
> SQLUDR_INT16 *outInd1,
> SQLUDR_TRAIL_ARGS)
> {
> if (calltype == SQLUDR_CALLTYPE_FINAL)
> return SQLUDR_SUCCESS;
> (*out1) = rand();
> return SQLUDR_SUCCESS;
> }
> {noformat}
> Compile the UDF:
> {noformat}
> gcc -g -Wall -I$TRAF_HOME/export/include/sql -shared -fPIC -o
> scalar_rand_udf.so scalar_rand_udf.c
> {noformat}
> Create the UDF and run it:
> {noformat}
> drop function scalar_rand_udf;
> drop library scalar_rand_udf_lib;
> create library scalar_rand_udf_lib
> file '/home/zellerh/src/scalar_rand_udf/scalar_rand_udf.so';
> create function scalar_rand_udf() returns (rnd int)
> external name 'scalar_rand_udf' library scalar_rand_udf_lib
> not deterministic no sql no transaction required;
> prepare s from
> select scalar_rand_udf(), scalar_rand_udf()
> from (values (1), (2), (3)) T(s);
> explain options 'f' s;
> execute s;
> {noformat}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)