=== Test case: qlc_SUITE:join_option/1 (click for source code)
=== Config value:
[{watchdog,<0.266888.0>},
{tc_logfile,"/buildroot/otp/lib/stdlib/make_test_dir/ct_logs/ct_run.test_server@5d18ee2164c5.2025-09-17_12.01.51/make_test_dir.stdlib_test.logs/run.2025-09-17_12.02.28/qlc_suite.join_option.html"},
{tc_group_properties,[{name,join}]},
{tc_group_path,[]},
{data_dir,"/buildroot/otp/lib/stdlib/make_test_dir/stdlib_test/qlc_SUITE_data/"},
{priv_dir,"/buildroot/otp/lib/stdlib/make_test_dir/ct_logs/ct_run.test_server@5d18ee2164c5.2025-09-17_12.01.51/make_test_dir.stdlib_test.logs/run.2025-09-17_12.02.28/log_private/"},
{nodenames,[]}]
=== Current directory is "/buildroot/otp/lib/stdlib/make_test_dir/ct_logs/ct_run.test_server@5d18ee2164c5.2025-09-17_12.01.51"
=== Started at 2025-09-17 12:20:30
<<"Q1 = qlc:q([X || X <- [1,2,3]],{join,merge}),\n {'EXIT', {no_join_to_carry_out,_}} = (catch {foo, qlc:info(Q1)}),\n {'EXIT', {no_join_to_carry_out,_}} = (catch {foo, qlc:e(Q1)}),\n\n Q2 = qlc:q([X || X <- [1,2,3], X > 1],{join,merge}),\n {'EXIT', {no_join_to_carry_out,_}} = (catch {foo, qlc:info(Q2)}),\n {'EXIT', {no_join_to_carry_out,_}} = (catch {foo, qlc:e(Q2)}),\n\n Q3 = qlc:q([{X,Y} ||\n {X} <- [{1},{2},{3}],\n {Y} <- [{a},{b},{c}],\n X =:= Y],\n {join, merge}),\n\n {1,0,0,2} = join_info(Q3),\n [] = qlc:e(Q3),\n\n Q4 = qlc:q([{X,Y} ||\n {X} <- [{1},{2},{3}],\n {Y} <- [{a},{b},{c}],\n X > Y],\n {join, lookup}),\n {'EXIT', {no_join_to_carry_out, _}} = (catch {foo, qlc:info(Q4)}),\n {'EXIT', {no_join_to_carry_out, _}} = (catch {foo, qlc:e(Q4)}),\n\n Q5 = qlc:q([{X,Y} ||\n {X} <- [{1},{2},{3}],\n {Y} <- [{3},{4},{5}],\n X == Y],\n {join, merge}),\n [{3,3}] = qlc:e(Q5),\n\n Q6 = qlc:q([{X,Y} ||\n {X} <- [{1},{2},{3}],\n {Y} <- [{3},{4},{5}],\n X == Y],\n {join, lookup}),\n {'EXIT', {cannot_carry_out_join, _}} = (catch {foo, qlc:info(Q6)}),\n {'EXIT', {cannot_carry_out_join, _}} = (catch {foo, qlc:e(Q6)}),\n\n Q7 = qlc:q([{X,Y} ||\n {X} <- [{1},{2},{3}],\n {Y} <- [{3},{4},{5}],\n X == Y],\n {join, nested_loop}),\n {0,0,1,0} = join_info(Q7),\n [{3,3}] = qlc:e(Q7),\n\n Q8 = qlc:q([{X,Y} ||\n {X} <- [{1},{2},{3}],\n {Y} <- [{3},{4},{5}],\n X =:= Y],\n {join, nested_loop}),\n {0,0,1,0} = join_info(Q8),\n [{3,3}] = qlc:e(Q8),\n\n %% Only guards are inspected...\n Q9 = qlc:q([{X,Y} ||\n {X} <- [{1},{2},{3}],\n {Y} <- [{3},{4},{5}],\n begin X =:= Y end],\n {join, nested_loop}),\n {'EXIT', {no_join_to_carry_out, _}} = (catch {foo, qlc:info(Q9)}),\n {'EXIT', {no_join_to_carry_out, _}} = (catch {foo, qlc:e(Q9)}),\n\n Q10 = qlc:q([{X,Y} ||\n {X} <- [{1},{2},{3}],\n {Y} <- [{3},{4},{5}],\n X < Y],\n {join, nested_loop}),\n {'EXIT', {no_join_to_carry_out, _}} = (catch {foo, qlc:info(Q10)}),\n {'EXIT', {no_join_to_carry_out, _}} = (catch {foo, qlc:e(Q10)}),\n\n F = fun(J) -> qlc:q([X || X <- [1,2]], {join,J}) end,\n {'EXIT', {no_join_to_carry_out, _}} = \n (catch {foo, qlc:e(F(merge))}),\n {'EXIT', {no_join_to_carry_out, _}} = \n (catch {foo, qlc:e(F(lookup))}),\n {'EXIT', {no_join_to_carry_out, _}} = \n (catch {foo, qlc:e(F(nested_loop))}),\n [1,2] = qlc:e(F(any)),\n\n %% No join of columns in the same table.\n Q11 = qlc:q([{X,Y} || {a = X, X = Y} <- [{a,1},{a,a},{a,3},{a,a}]],\n {join,merge}),\n {'EXIT', {no_join_to_carry_out, _}} = (catch qlc:e(Q11)),\n Q12 = qlc:q([{X,Y} || {X = a, X = Y} <- [{a,1},{a,a},{a,3},{a,a}]],\n {join,merge}),\n {'EXIT', {no_join_to_carry_out, _}} = (catch qlc:e(Q12)),\n %% X and Y are \"equal\" (same constants), but must not be joined.\n Q13 = qlc:q([{X,Y} || {X,_Z} <- [{a,1},{a,2},{b,1},{b,2}],\n {Y} <- [{a}],\n (X =:= a) and (Y =:= b) or \n (X =:= b) and (Y =:= a)],\n {join,merge}),\n {'EXIT', {no_join_to_carry_out, _}} = (catch qlc:e(Q13))\n\n">>
<<"Q1 = qlc:q([X || X <- [1,2,3]], {lookup,true}),\n {'EXIT', {no_lookup_to_carry_out, _}} = (catch {foo, qlc:info(Q1)}),\n {'EXIT', {no_lookup_to_carry_out, _}} = (catch {foo, qlc:e(Q1)}),\n Q2 = qlc:q([{X,Y} || X <- [1,2,3], Y <- [x,y,z]], lookup),\n {'EXIT', {no_lookup_to_carry_out, _}} = (catch {foo, qlc:info(Q2)}),\n {'EXIT', {no_lookup_to_carry_out, _}} = (catch {foo, qlc:e(Q2)}),\n Q3 = qlc:q([X || {X} <- [{1},{2},{3}]], {lookup,true}),\n {'EXIT', {no_lookup_to_carry_out, _}} = (catch {foo, qlc:e(Q3)}),\n {'EXIT', {no_lookup_to_carry_out, _}} = (catch {foo, qlc:info(Q3)}),\n\n E1 = create_ets(1, 10),\n Q4 = qlc:q([{X,Y} || {X,Y} <- ets:table(E1), X =:= 3], lookup),\n {match_spec, _} = strip_qlc_call(Q4),\n [{3,3}] = qlc:e(Q4),\n Q5 = qlc:q([{X,Y} || {X,Y} <- ets:table(E1), X =:= 3], {lookup,false}),\n {table, ets, _} = strip_qlc_call(Q5),\n [{3,3}] = qlc:e(Q5),\n Q6 = qlc:q([{X,Y} || {X,Y} <- ets:table(E1), X =:= 3], {lookup,any}),\n {match_spec, _} = strip_qlc_call(Q6),\n [{3,3}] = qlc:e(Q6),\n ets:delete(E1)">>
<<"L1 = [1,2],\n L2 = [{1,a},{2,b}],\n L3 = [{a,1},{b,2}],\n Q = qlc:q([{X,Y,Z} ||\n Z <- L1,\n {X,_} <- L2,\n {_,Y} <- L3,\n X =:= Y],\n [cache, unique]),\n {qlc,_,\n [{generate,_,{list,L1}},\n {generate,_,{qlc,_,[{generate,_,\n {qlc,_,[{generate,_,{keysort,{list,L2},1,[]}}],[]}},\n {generate,_,{qlc,_,\n [{generate,_,{keysort,{list,L3},2,[]}}],[]}},_],\n [{join,merge},{cache,ets},{unique,true}]}},_],\n [{unique,true}]} = i(Q),\n [{1,1,1},{2,2,1},{1,1,2},{2,2,2}] = qlc:e(Q)">>
<<"L1 = [1,2],\n L2 = [{1,a},{2,b}],\n L3 = [{a,1},{b,2}],\n Q = qlc:q([{X,Y,Z} ||\n Z <- L1,\n {X,_} <- L2,\n {_,Y} <- L3,\n X =:= Y],\n []),\n Options = [{cache_all,ets}, unique_all],\n {qlc,_,[{generate,_,{qlc,_,[{generate,_,{list,L1}}],\n [{unique,true}]}},\n {generate,_,{qlc,_,\n [{generate,_,{qlc,_,[{generate,_,\n {keysort,{qlc,_,[{generate,_,{list,L2}}],\n [{cache,ets},{unique,true}]},\n 1,[]}}],[]}},\n {generate,_,{qlc,_,\n [{generate,_,{keysort,\n {qlc,_,[{generate,_,{list,L3}}],\n [{cache,ets},{unique,true}]},\n 2,[]}}],[]}},_],\n [{join,merge},{cache,ets},{unique,true}]}},\n _],[{unique,true}]} = i(Q, Options),\n [{1,1,1},{2,2,1},{1,1,2},{2,2,2}] = qlc:e(Q, Options)">>
=== Ended at 2025-09-17 12:20:31
=== successfully completed test case
=== === Returned value: ok
Test run history | Top level test index | Latest test result