# 2022-05-13 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # # This file implements tests for JOINs that use Bloom filters. # # The test case output is (mostly) all generated by PostgreSQL 14. This # test module was created as follows: # # 1. Run a TCL script (included at the bottom of this file) that # generates an input script for "psql" that will run man # diverse tests on joins. # # 2. Run the script from step (1) through psql and collect the # output. # # 3. Make a few minor global search-and-replace operations to convert # the psql output into a form suitable for this test module. # # 4. Add this header, and the script content at the footer. # set testdir [file dirname $argv0] source $testdir/tester.tcl db nullvalue - db eval { CREATE TABLE t1(a INT); INSERT INTO t1 VALUES(1),(NULL); CREATE TABLE t2(b INT); INSERT INTO t2 VALUES(2),(NULL); } do_execsql_test joinE-1 { SELECT a, b FROM t1 INNER JOIN t2 ON true ORDER BY coalesce(a,b,3); } { 1 2 1 - - 2 - - } do_execsql_test joinE-2 { SELECT a, b FROM t1 INNER JOIN t2 ON true WHERE a IS NULL ORDER BY coalesce(a,b,3); } { - 2 - - } do_execsql_test joinE-3 { SELECT a, b FROM t1 INNER JOIN t2 ON a IS NULL ORDER BY coalesce(a,b,3); } { - 2 - - } do_execsql_test joinE-4 { SELECT a, b FROM t1 INNER JOIN t2 ON true WHERE b IS NULL ORDER BY coalesce(a,b,3); } { 1 - - - } do_execsql_test joinE-5 { SELECT a, b FROM t1 INNER JOIN t2 ON b IS NULL ORDER BY coalesce(a,b,3); } { 1 - - - } do_execsql_test joinE-6 { SELECT a, b FROM t1 LEFT JOIN t2 ON true ORDER BY coalesce(a,b,3); } { 1 2 1 - - 2 - - } do_execsql_test joinE-7 { SELECT a, b FROM t1 LEFT JOIN t2 ON true WHERE a IS NULL ORDER BY coalesce(a,b,3); } { - 2 - - } do_execsql_test joinE-8 { SELECT a, b FROM t1 LEFT JOIN t2 ON a IS NULL ORDER BY coalesce(a,b,3); } { 1 - - 2 - - } do_execsql_test joinE-9 { SELECT a, b FROM t1 LEFT JOIN t2 ON true WHERE b IS NULL ORDER BY coalesce(a,b,3); } { 1 - - - } do_execsql_test joinE-10 { SELECT a, b FROM t1 LEFT JOIN t2 ON b IS NULL ORDER BY coalesce(a,b,3); } { 1 - - - } do_execsql_test joinE-11 { SELECT a, b FROM t1 RIGHT JOIN t2 ON true ORDER BY coalesce(a,b,3); } { 1 2 1 - - 2 - - } do_execsql_test joinE-12 { SELECT a, b FROM t1 RIGHT JOIN t2 ON true WHERE a IS NULL ORDER BY coalesce(a,b,3); } { - 2 - - } do_execsql_test joinE-13 { SELECT a, b FROM t1 RIGHT JOIN t2 ON a IS NULL ORDER BY coalesce(a,b,3); } { - 2 - - } do_execsql_test joinE-14 { SELECT a, b FROM t1 RIGHT JOIN t2 ON true WHERE b IS NULL ORDER BY coalesce(a,b,3); } { 1 - - - } do_execsql_test joinE-15 { SELECT a, b FROM t1 RIGHT JOIN t2 ON b IS NULL ORDER BY coalesce(a,b,3); } { 1 - - 2 - - } do_execsql_test joinE-16 { SELECT a, b FROM t1 FULL JOIN t2 ON true ORDER BY coalesce(a,b,3); } { 1 2 1 - - 2 - - } do_execsql_test joinE-17 { SELECT a, b FROM t1 FULL JOIN t2 ON true WHERE a IS NULL ORDER BY coalesce(a,b,3); } { - 2 - - } # PG-14 is unable to perform this join. It says: FULL JOIN is only # supported with merge-joinable or hash-joinable join conditions # # do_execsql_test joinE-18 { # SELECT a, b # FROM t1 FULL JOIN t2 ON a IS NULL # ORDER BY coalesce(a,b,3); # } { # } do_execsql_test joinE-19 { SELECT a, b FROM t1 FULL JOIN t2 ON true WHERE b IS NULL ORDER BY coalesce(a,b,3); } { 1 - - - } # PG-14 is unable to perform this join. It says: FULL JOIN is only # supported with merge-joinable or hash-joinable join conditions # # do_execsql_test joinE-20 { # SELECT a, b # FROM t1 FULL JOIN t2 ON b IS NULL # ORDER BY coalesce(a,b,3); # } { # } db eval { DELETE FROM t1; INSERT INTO t1 VALUES(1); DELETE FROM t2; INSERT INTO t2 VALUES(NULL); } do_execsql_test joinE-21 { SELECT a, b FROM t1 INNER JOIN t2 ON true ORDER BY coalesce(a,b,3); } { 1 - } do_execsql_test joinE-22 { SELECT a, b FROM t1 INNER JOIN t2 ON true WHERE a IS NULL ORDER BY coalesce(a,b,3); } { } do_execsql_test joinE-23 { SELECT a, b FROM t1 INNER JOIN t2 ON a IS NULL ORDER BY coalesce(a,b,3); } { } do_execsql_test joinE-24 { SELECT a, b FROM t1 INNER JOIN t2 ON true WHERE b IS NULL ORDER BY coalesce(a,b,3); } { 1 - } do_execsql_test joinE-25 { SELECT a, b FROM t1 INNER JOIN t2 ON b IS NULL ORDER BY coalesce(a,b,3); } { 1 - } do_execsql_test joinE-26 { SELECT a, b FROM t1 LEFT JOIN t2 ON true ORDER BY coalesce(a,b,3); } { 1 - } do_execsql_test joinE-27 { SELECT a, b FROM t1 LEFT JOIN t2 ON true WHERE a IS NULL ORDER BY coalesce(a,b,3); } { } do_execsql_test joinE-28 { SELECT a, b FROM t1 LEFT JOIN t2 ON a IS NULL ORDER BY coalesce(a,b,3); } { 1 - } do_execsql_test joinE-29 { SELECT a, b FROM t1 LEFT JOIN t2 ON true WHERE b IS NULL ORDER BY coalesce(a,b,3); } { 1 - } do_execsql_test joinE-30 { SELECT a, b FROM t1 LEFT JOIN t2 ON b IS NULL ORDER BY coalesce(a,b,3); } { 1 - } do_execsql_test joinE-31 { SELECT a, b FROM t1 RIGHT JOIN t2 ON true ORDER BY coalesce(a,b,3); } { 1 - } do_execsql_test joinE-32 { SELECT a, b FROM t1 RIGHT JOIN t2 ON true WHERE a IS NULL ORDER BY coalesce(a,b,3); } { } do_execsql_test joinE-33 { SELECT a, b FROM t1 RIGHT JOIN t2 ON a IS NULL ORDER BY coalesce(a,b,3); } { - - } do_execsql_test joinE-34 { SELECT a, b FROM t1 RIGHT JOIN t2 ON true WHERE b IS NULL ORDER BY coalesce(a,b,3); } { 1 - } do_execsql_test joinE-35 { SELECT a, b FROM t1 RIGHT JOIN t2 ON b IS NULL ORDER BY coalesce(a,b,3); } { 1 - } do_execsql_test joinE-36 { SELECT a, b FROM t1 FULL JOIN t2 ON true ORDER BY coalesce(a,b,3); } { 1 - } do_execsql_test joinE-37 { SELECT a, b FROM t1 FULL JOIN t2 ON true WHERE a IS NULL ORDER BY coalesce(a,b,3); } { } # PG-14 is unable # # do_execsql_test joinE-38 { # SELECT a, b # FROM t1 FULL JOIN t2 ON a IS NULL # ORDER BY coalesce(a,b,3); # } { # } do_execsql_test joinE-39 { SELECT a, b FROM t1 FULL JOIN t2 ON true WHERE b IS NULL ORDER BY coalesce(a,b,3); } { 1 - } # PG-14 is unable # do_execsql_test joinE-40 { # SELECT a, b # FROM t1 FULL JOIN t2 ON b IS NULL # ORDER BY coalesce(a,b,3); # } { # } finish_test ############################################################################## # This is the PG-14 test script generator # # puts " # \\pset border off # \\pset tuples_only on # \\pset null - # # DROP TABLE IF EXISTS t1; # DROP TABLE IF EXISTS t2; # CREATE TABLE t1(a INT); # INSERT INTO t1 VALUES(1),(NULL); # CREATE TABLE t2(b INT); # INSERT INTO t2 VALUES(2),(NULL); # " # # proc echo {prefix txt} { # regsub -all {\n} $txt \n$prefix txt # puts "$prefix$txt" # } # # set n 0 # set k 0 # foreach j1 {INNER LEFT RIGHT FULL} { # foreach on1 { # true # {true WHERE a IS NULL} # {a IS NULL} # {true WHERE b IS NULL} # {b IS NULL} # } { # # incr n # incr k # set q1 "" # append q1 "SELECT a, b\n" # append q1 " FROM t1 $j1 JOIN t2 ON $on1\n" # append q1 " ORDER BY coalesce(a,b,3);" # # echo "\\qecho " "do_execsql_test joinE-$n \{" # echo "\\qecho X " $q1 # echo "\\qecho " "\} \{" # puts $q1 # echo "\\qecho " "\}" # # } # } # # puts " # DELETE FROM t1; # INSERT INTO t1 VALUES(1); # DELETE FROM t2; # INSERT INTO t2 VALUES(NULL); # " # # foreach j1 {INNER LEFT RIGHT FULL} { # foreach on1 { # true # {true WHERE a IS NULL} # {a IS NULL} # {true WHERE b IS NULL} # {b IS NULL} # } { # # incr n # incr k # set q1 "" # append q1 "SELECT a, b\n" # append q1 " FROM t1 $j1 JOIN t2 ON $on1\n" # append q1 " ORDER BY coalesce(a,b,3);" # # echo "\\qecho " "do_execsql_test joinE-$n \{" # echo "\\qecho X " $q1 # echo "\\qecho " "\} \{" # puts $q1 # echo "\\qecho " "\}" # # } # }