summaryrefslogtreecommitdiffstats
path: root/test/values.test
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-03 05:16:44 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-03 05:16:44 +0000
commit62a67b10ff9f9eea6a4695649fb8252d2a4bc74d (patch)
tree7b54cadc082d323cda5fd24248e85b7d2ea664a3 /test/values.test
parentAdding debian version 3.45.3-1. (diff)
downloadsqlite3-62a67b10ff9f9eea6a4695649fb8252d2a4bc74d.tar.xz
sqlite3-62a67b10ff9f9eea6a4695649fb8252d2a4bc74d.zip
Merging upstream version 3.46.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'test/values.test')
-rw-r--r--test/values.test715
1 files changed, 715 insertions, 0 deletions
diff --git a/test/values.test b/test/values.test
new file mode 100644
index 0000000..fed2c5c
--- /dev/null
+++ b/test/values.test
@@ -0,0 +1,715 @@
+# 2024 March 3
+#
+# 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 regression tests for SQLite library.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+set testprefix values
+
+
+do_execsql_test 1.0 {
+ CREATE TABLE x1(a, b, c);
+}
+
+
+explain_i {
+ INSERT INTO x1(a, b, c) VALUES(1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4);
+}
+do_execsql_test 1.1.1 {
+ INSERT INTO x1 VALUES(1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4);
+}
+do_execsql_test 1.1.2 {
+ SELECT * FROM x1;
+} {
+ 1 1 1
+ 2 2 2
+ 3 3 3
+ 4 4 4
+}
+
+do_execsql_test 1.2.0 {
+ DELETE FROM x1
+}
+do_execsql_test 1.2.1 {
+ INSERT INTO x1 VALUES(1, 1, 1), (2, 2, 2), (3, 3, 3) UNION ALL SELECT 4, 4, 4;
+ SELECT * FROM x1;
+} {1 1 1 2 2 2 3 3 3 4 4 4}
+
+sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT 4
+
+do_execsql_test 1.2.2 {
+ DELETE FROM x1;
+ INSERT INTO x1
+ VALUES(1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5)
+ UNION ALL SELECT 6, 6, 6;
+ SELECT * FROM x1;
+} {1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6}
+
+do_execsql_test 1.2.3 {
+ DELETE FROM x1;
+ INSERT INTO x1
+ VALUES(1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4)
+ UNION ALL SELECT 6, 6, 6;
+ SELECT * FROM x1;
+} {1 1 1 2 2 2 3 3 3 4 4 4 6 6 6}
+
+do_execsql_test 1.2.4 {
+ DELETE FROM x1;
+ INSERT INTO x1 VALUES(1, 1, 1), (2, 2, 2), (3, 3, 3) UNION ALL SELECT 6, 6, 6;
+ SELECT * FROM x1;
+} {
+ 1 1 1
+ 2 2 2
+ 3 3 3
+ 6 6 6
+}
+
+set a 4
+set b 5
+set c 6
+do_execsql_test 1.2.5 {
+ DELETE FROM x1;
+ INSERT INTO x1
+ VALUES(1, 1, 1), (2, 2, 2), (3, 3, 3),
+ (4, 4, $a), (5, 5, $b), (6, 6, $c)
+}
+
+do_execsql_test 1.2.6 {
+ SELECT * FROM x1;
+} {
+ 1 1 1
+ 2 2 2
+ 3 3 3
+ 4 4 4
+ 5 5 5
+ 6 6 6
+}
+
+#-------------------------------------------------------------------------
+# SQLITE_LIMIT_COMPOUND_SELECT set to 0.
+#
+reset_db
+
+do_execsql_test 2.0 {
+ CREATE TABLE x1(a, b, c);
+}
+
+sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT 3
+
+do_catchsql_test 2.1.1 {
+ INSERT INTO x1 VALUES
+ (1, 1, 1),
+ (2, 2, 2),
+ (3, 3, 3),
+ (4, 4, 4),
+ (5, 5, 5),
+ (6, 6, 6),
+ (7, 7, 7),
+ (8, 8, 8),
+ (9, 9, 9),
+ (10, 10, 10, 10)
+} {1 {all VALUES must have the same number of terms}}
+
+do_catchsql_test 2.1.2 {
+ INSERT INTO x1 VALUES
+ (1, 1, 1),
+ (2, 2, 2, 2),
+ (3, 3, 3),
+ (4, 4, 4),
+ (5, 5, 5),
+ (6, 6, 6),
+ (7, 7, 7),
+ (8, 8, 8),
+ (9, 9, 9),
+ (10, 10, 10)
+} {1 {all VALUES must have the same number of terms}}
+
+sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT 0
+
+do_execsql_test 2.2 {
+ INSERT INTO x1 VALUES
+ (1, 1, 1),
+ (2, 2, 2),
+ (3, 3, 3),
+ (4, 4, 4),
+ (5, 5, 5),
+ (6, 6, 6),
+ (7, 7, 7),
+ (8, 8, 8),
+ (9, 9, 9),
+ (10, 10, 10)
+} {}
+do_execsql_test 2.3 {
+ INSERT INTO x1 VALUES
+ (1, 1, 1),
+ (2, 2, 2),
+ (3, 3, 3),
+ (4, 4, 4),
+ (5, 5, 5),
+ (6, 6, 6),
+ (7, 7, 7),
+ (8, 8, 8),
+ (9, 9, 9),
+ (10, 10, 10)
+ UNION ALL
+ SELECT 5, 12, 12
+ ORDER BY 1
+} {}
+
+#-------------------------------------------------------------------------
+reset_db
+
+do_execsql_test 3.0 {
+ CREATE TABLE y1(x, y);
+}
+
+do_execsql_test 3.1.1 {
+ DELETE FROM y1;
+ INSERT INTO y1 VALUES(1, 2), (3, 4), (row_number() OVER (), 5);
+}
+do_execsql_test 3.1.2 {
+ SELECT * FROM y1;
+} {1 2 3 4 1 5}
+do_execsql_test 3.2.1 {
+ DELETE FROM y1;
+ INSERT INTO y1 VALUES(1, 2), (3, 4), (row_number() OVER (), 6)
+ , (row_number() OVER (), 7)
+}
+do_execsql_test 3.1.2 {
+ SELECT * FROM y1;
+} {1 2 3 4 1 6 1 7}
+
+#-------------------------------------------------------------------------
+reset_db
+
+do_execsql_test 4.0 {
+ CREATE TABLE x1(a PRIMARY KEY, b) WITHOUT ROWID;
+}
+
+foreach {tn iLimit} {1 0 2 3} {
+ sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT $iLimit
+
+ do_execsql_test 4.1.1 {
+ DELETE FROM x1;
+ INSERT INTO x1 VALUES
+ (1, 1),
+ (2, (SELECT * FROM (VALUES('a'), ('b'), ('c'), ('d')) ))
+ }
+ do_execsql_test 4.1.2 {
+ SELECT * FROM x1
+ } {1 1 2 a}
+
+ do_execsql_test 4.2.1 {
+ DELETE FROM x1;
+ INSERT INTO x1 VALUES
+ (1, 1),
+ (2, 2),
+ (3, 3),
+ (4, 4),
+ (5, (SELECT * FROM (VALUES('a'), ('b'), ('c'), ('d')) ))
+ }
+ do_execsql_test 4.2.2 {
+ SELECT * FROM x1
+ } {1 1 2 2 3 3 4 4 5 a}
+
+ do_execsql_test 4.3.1 {
+ DELETE FROM x1;
+ INSERT INTO x1 VALUES
+ (1, (SELECT * FROM (VALUES('a'), ('b'), ('c'), ('d'), ('e')) ))
+ }
+ do_execsql_test 4.3.2 {
+ SELECT * FROM x1
+ } {1 a}
+}
+
+#------------------------------------------------------------------------
+reset_db
+
+do_execsql_test 5.0 {
+ CREATE VIEW v1 AS VALUES(1, 2, 3), (4, 5, 6), (7, 8, 9);
+}
+do_execsql_test 5.1 {
+ SELECT * FROM v1
+} {1 2 3 4 5 6 7 8 9}
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 6.0 {
+ CREATE TABLE t1(x);
+ INSERT INTO t1 VALUES(1), (2);
+}
+
+do_execsql_test 6.1 {
+ SELECT ( VALUES( x ), ( x ) ) FROM t1;
+} {1 2}
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 6.0 {
+ CREATE TABLE t1(x);
+ INSERT INTO t1 VALUES('x'), ('y');
+}
+
+do_execsql_test 6.1 {
+ SELECT * FROM t1, (VALUES(1), (2))
+} {x 1 x 2 y 1 y 2}
+
+do_execsql_test 6.2 {
+ VALUES(CAST(44 AS REAL)),(55);
+} {44.0 55}
+
+#------------------------------------------------------------------------
+do_execsql_test 7.1 {
+ WITH x1(a, b) AS (
+ VALUES(1, 2), ('a', 'b')
+ )
+ SELECT * FROM x1 one, x1 two
+} {
+ 1 2 1 2
+ 1 2 a b
+ a b 1 2
+ a b a b
+}
+
+#-------------------------------------------------------------------------
+reset_db
+
+set VVV {
+ ( VALUES('a', 'b'), ('c', 'd'), (123, NULL) )
+}
+set VVV2 {
+ (
+ SELECT 'a' AS column1, 'b' AS column2
+ UNION ALL SELECT 'c', 'd' UNION ALL SELECT 123, NULL
+ )
+}
+
+do_execsql_test 8.0 {
+ CREATE TABLE t1(x);
+ INSERT INTO t1 VALUES('d'), (NULL), (123)
+}
+foreach {tn q res} {
+ 1 "SELECT * FROM t1 LEFT JOIN VVV" {
+ d a b d c d d 123 {}
+ {} a b {} c d {} 123 {}
+ 123 a b 123 c d 123 123 {}
+ }
+
+ 2 "SELECT * FROM t1 LEFT JOIN VVV ON (column1=x)" {
+ d {} {}
+ {} {} {}
+ 123 123 {}
+ }
+
+ 3 "SELECT * FROM t1 RIGHT JOIN VVV" {
+ d a b d c d d 123 {}
+ {} a b {} c d {} 123 {}
+ 123 a b 123 c d 123 123 {}
+ }
+
+ 4 "SELECT * FROM t1 RIGHT JOIN VVV ON (column1=x)" {
+ 123 123 {}
+ {} a b
+ {} c d
+ }
+
+ 5 "SELECT * FROM t1 FULL OUTER JOIN VVV ON (column1=x)" {
+ d {} {}
+ {} {} {}
+ 123 123 {}
+ {} a b
+ {} c d
+ }
+
+ 6 "SELECT count(*) FROM VVV" { 3 }
+
+ 7 "SELECT (SELECT column1 FROM VVV)" { a }
+
+ 8 "SELECT * FROM VVV UNION ALL SELECT * FROM VVV" {
+ a b c d 123 {}
+ a b c d 123 {}
+ }
+
+ 9 "SELECT * FROM VVV INTERSECT SELECT * FROM VVV" {
+ 123 {} a b c d
+ }
+
+ 10 "SELECT * FROM VVV eXCEPT SELECT * FROM VVV" { }
+
+ 11 "SELECT * FROM VVV eXCEPT SELECT 'a', 'b'" { 123 {} c d }
+
+} {
+ set q1 [string map [list VVV $VVV] $q]
+ set q2 [string map [list VVV $VVV2] $q]
+ set q3 "WITH VVV AS $VVV $q"
+
+ do_execsql_test 8.1.$tn.1 $q1 $res
+ do_execsql_test 8.1.$tn.2 $q2 $res
+ do_execsql_test 8.1.$tn.3 $q3 $res
+}
+
+#-------------------------------------------------------------------------
+reset_db
+
+do_execsql_test 9.1 {
+ VALUES(456), (123), (NULL) UNION ALL SELECT 122 ORDER BY 1
+} { {} 122 123 456 }
+
+do_execsql_test 9.2 {
+ VALUES (1, 2), (3, 4), (
+ ( SELECT column1 FROM ( VALUES (5, 6), (7, 8) ) ),
+ ( SELECT max(column2) FROM ( VALUES (5, 1), (7, 6) ) )
+ )
+} { 1 2 3 4 5 6 }
+
+do_execsql_test 10.1 {
+ CREATE TABLE a2(a, b, c DEFAULT 'xyz');
+}
+do_execsql_test 10.2 {
+ INSERT INTO a2(a) VALUES(3),(4);
+}
+
+#-------------------------------------------------------------------------
+reset_db
+ifcapable fts5 {
+ do_execsql_test 11.0 {
+ CREATE VIRTUAL TABLE ft USING fts3(x);
+ }
+ do_execsql_test 11.1 {
+ INSERT INTO ft VALUES('one'), ('two');
+ }
+}
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 12.0 {
+ CREATE TABLE t1(a, b);
+}
+do_execsql_test 12.1 {
+ INSERT INTO t1 SELECT 1, 2 UNION ALL VALUES(3, 4), (5, 6);
+}
+do_execsql_test 12.2 {
+ SELECT * FROM t1
+} {1 2 3 4 5 6}
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 13.0 {
+ CREATE TABLE t1(x);
+ INSERT INTO t1 VALUES('xyz');
+
+ SELECT (
+ VALUES( (max(substr('abc', 1, 1), x)) ),
+ (123),
+ (456)
+ )
+ FROM t1;
+} {xyz}
+
+do_catchsql_test 13.1 {
+ VALUES(300), (zeroblob(300) OVER win);
+} {1 {zeroblob() may not be used as a window function}}
+
+#--------------------------------------------------------------------------
+reset_db
+do_execsql_test 14.1 {
+ PRAGMA encoding = utf16;
+ CREATE TABLE t1(a, b);
+} {}
+
+db close
+sqlite3 db test.db
+
+do_execsql_test 14.2 {
+ INSERT INTO t1 VALUES
+ (17, 'craft'),
+ (16, 'urtlek' IN(1,2,3));
+}
+
+#--------------------------------------------------------------------------
+#
+reset_db
+do_eqp_test 15.1 {
+ VALUES(1),(2),(3),(4),(5);
+} {
+ QUERY PLAN
+ `--SCAN 5-ROW VALUES CLAUSE
+}
+do_execsql_test 15.2 {
+ CREATE TABLE t1(a,b);
+}
+do_eqp_test 15.3 {
+ INSERT INTO t1 VALUES
+ (1,2),(3,4),(7,8);
+} {
+ QUERY PLAN
+ `--SCAN 3-ROW VALUES CLAUSE
+}
+do_eqp_test 15.4 {
+ INSERT INTO t1 VALUES
+ (1,2),(3,4),(7,8),
+ (5,row_number()OVER());
+} {
+ QUERY PLAN
+ `--COMPOUND QUERY
+ |--LEFT-MOST SUBQUERY
+ | `--SCAN 3-ROW VALUES CLAUSE
+ `--UNION ALL
+ |--CO-ROUTINE (subquery-xxxxxx)
+ | `--SCAN CONSTANT ROW
+ `--SCAN (subquery-xxxxxx)
+}
+do_eqp_test 15.5 {
+ SELECT * FROM (VALUES(1),(2),(3),(4),(5),(6)), (VALUES('a'),('b'),('c'));
+} {
+ QUERY PLAN
+ |--SCAN 6-ROW VALUES CLAUSE
+ `--SCAN 3-ROW VALUES CLAUSE
+}
+do_execsql_test 15.6 {
+ CREATE TABLE t2(x,y);
+}
+do_eqp_test 15.7 {
+ SELECT * FROM t2 UNION ALL VALUES(1,2),(3,4),(5,6),(7,8);
+} {
+ QUERY PLAN
+ `--COMPOUND QUERY
+ |--LEFT-MOST SUBQUERY
+ | `--SCAN t2
+ `--UNION ALL
+ `--SCAN 4-ROW VALUES CLAUSE
+}
+
+#--------------------------------------------------------------------------
+# The VALUES-as-coroutine optimization can be applied to later rows of
+# a VALUES clause even if earlier rows do not qualify.
+#
+reset_db
+do_execsql_test 16.1 {
+ CREATE TABLE t1(a,b);
+}
+do_execsql_test 16.2 {
+ BEGIN;
+ INSERT INTO t1 VALUES(1,2),(3,4),(5,6),
+ (7,row_number()OVER()),
+ (9,10), (11,12), (13,14), (15,16);
+ SELECT * FROM t1 ORDER BY a, b;
+ ROLLBACK;
+} {1 2 3 4 5 6 7 1 9 10 11 12 13 14 15 16}
+do_eqp_test 16.3 {
+ INSERT INTO t1 VALUES(1,2),(3,4),(5,6),
+ (7,row_number()OVER()),
+ (9,10), (11,12), (13,14), (15,16);
+} {
+ QUERY PLAN
+ `--COMPOUND QUERY
+ |--LEFT-MOST SUBQUERY
+ | `--SCAN 3-ROW VALUES CLAUSE
+ |--UNION ALL
+ | |--CO-ROUTINE (subquery-xxxxxx)
+ | | `--SCAN CONSTANT ROW
+ | `--SCAN (subquery-xxxxxx)
+ `--UNION ALL
+ `--SCAN 4-ROW VALUES CLAUSE
+}
+do_execsql_test 16.4 {
+ BEGIN;
+ INSERT INTO t1 VALUES
+ (1,row_number()OVER()),
+ (2,3), (4,5), (6,7);
+ SELECT * FROM t1 ORDER BY a, b;
+ ROLLBACK;
+} {1 1 2 3 4 5 6 7}
+do_eqp_test 16.5 {
+ INSERT INTO t1 VALUES
+ (1,row_number()OVER()),
+ (2,3), (4,5), (6,7);
+} {
+ QUERY PLAN
+ `--COMPOUND QUERY
+ |--LEFT-MOST SUBQUERY
+ | |--CO-ROUTINE (subquery-xxxxxx)
+ | | `--SCAN CONSTANT ROW
+ | `--SCAN (subquery-xxxxxx)
+ `--UNION ALL
+ `--SCAN 3-ROW VALUES CLAUSE
+}
+do_execsql_test 16.6 {
+ BEGIN;
+ INSERT INTO t1 VALUES
+ (1,2),(3,4),
+ (5,row_number()OVER()),
+ (7,8),(9,10),(11,12),
+ (13,row_number()OVER()),
+ (15,16),(17,18),(19,20),(21,22);
+ SELECT * FROM t1 ORDER BY a, b;
+ ROLLBACK;
+} { 1 2 3 4 5 1 7 8 9 10 11 12 13 1 15 16 17 18 19 20 21 22}
+do_eqp_test 16.7 {
+ INSERT INTO t1 VALUES
+ (1,2),(3,4),
+ (5,row_number()OVER()),
+ (7,8),(9,10),(11,12),
+ (13,row_number()OVER()),
+ (15,16),(17,18),(19,20),(21,22);
+} {
+ QUERY PLAN
+ `--COMPOUND QUERY
+ |--LEFT-MOST SUBQUERY
+ | `--SCAN 2-ROW VALUES CLAUSE
+ |--UNION ALL
+ | |--CO-ROUTINE (subquery-xxxxxx)
+ | | `--SCAN CONSTANT ROW
+ | `--SCAN (subquery-xxxxxx)
+ |--UNION ALL
+ | `--SCAN 3-ROW VALUES CLAUSE
+ |--UNION ALL
+ | |--CO-ROUTINE (subquery-xxxxxx)
+ | | `--SCAN CONSTANT ROW
+ | `--SCAN (subquery-xxxxxx)
+ `--UNION ALL
+ `--SCAN 4-ROW VALUES CLAUSE
+}
+
+#--------------------------------------------------------------------------
+# 2024-03-23 dbsqlfuzz crash-c2c5e7e08b7e489d270a26d895077a03f678c33b
+#
+do_execsql_test 17.1 {
+ DROP TABLE IF EXISTS t1;
+ CREATE TABLE t1 AS SELECT * FROM (VALUES(1,2), (3,4 IN (1,2,3)));
+}
+
+do_execsql_test 17.2 {
+ SELECT * FROM t1
+} {1 2 3 0}
+
+# 2024-03-25 dbsqlfuzz crash-74cf7c9904360322a6c917e4934b127543d1cd51
+#
+do_catchsql_test 18.1 {
+ DROP TABLE t1;
+ CREATE TABLE t1(x INTEGER PRIMARY KEY);
+ INSERT INTO t1 VALUES(RAISE(IGNORE)),(0);
+} {1 {RAISE() may only be used within a trigger-program}}
+do_catchsql_test 18.2 {
+ DROP TABLE t1;
+ CREATE TABLE t1(x INTEGER PRIMARY KEY, y, z);
+ CREATE TRIGGER r2 AFTER INSERT ON t1 BEGIN
+ INSERT INTO t1(y) VALUES(RAISE(IGNORE)),(0);
+ END;
+ INSERT INTO t1 VALUES(1,2,3);
+ SELECT * FROM t1;
+} {0 {1 2 3}}
+do_catchsql_test 18.3.1 {
+ DROP TABLE t1;
+ CREATE TABLE t1(x INTEGER PRIMARY KEY, y, z);
+ CREATE TRIGGER r2 AFTER INSERT ON t1 BEGIN
+ INSERT INTO t1(y) VALUES(RAISE(ABORT,'error 18.3')),(0);
+ END;
+ INSERT INTO t1 VALUES(1,2,3);
+} {1 {error 18.3}}
+do_execsql_test 18.3.2 {
+ SELECT * FROM t1;
+} {}
+do_catchsql_test 18.4.1 {
+ DROP TABLE t1;
+ CREATE TABLE t1(x INTEGER PRIMARY KEY, y, z);
+ CREATE TRIGGER r2 AFTER INSERT ON t1 BEGIN
+ INSERT INTO t1(y) VALUES(1),(RAISE(ABORT,'error 18.4')),(0);
+ END;
+ INSERT INTO t1 VALUES(1,2,3);
+} {1 {error 18.4}}
+do_execsql_test 18.4.2 {
+ SELECT * FROM t1;
+} {}
+do_catchsql_test 18.5.1 {
+ DROP TABLE t1;
+ CREATE TABLE t1(x INTEGER PRIMARY KEY, y, z);
+ CREATE TRIGGER r2 AFTER INSERT ON t1 BEGIN
+ INSERT INTO t1(y) VALUES(1),
+ (CASE WHEN new.z>7 THEN RAISE(ABORT,'error 18.5') ELSE 2 END);
+ END;
+ INSERT INTO t1 VALUES(1,2,3);
+ SELECT * FROM t1;
+} {0 {1 2 3 2 1 {} 3 2 {}}}
+do_catchsql_test 18.5.2 {
+ DELETE FROM t1;
+ INSERT INTO t1 VALUES(1,2,13);
+} {1 {error 18.5}}
+do_catchsql_test 18.5.3 {
+ SELECT * FROM t1;
+} {0 {}}
+
+# 2024-04-18 dbsqlfuzz crash-bde3bf80aedf25afa56e2997a0545a314765d3f8
+# Verify that the VALUES expressions used as an argument to an outer
+# join work correctly.
+#
+reset_db
+db null NULL
+do_execsql_test 19.1 {
+ CREATE TABLE t1(a INT, b INT);
+ INSERT INTO t1 VALUES(11,22);
+ SELECT * FROM t1 LEFT JOIN (VALUES(33,44),(55,66)) AS t2 ON a=b;
+} {11 22 NULL NULL}
+do_execsql_test 19.2 {
+ SELECT * FROM (VALUES(33,44),(55,66)) AS t2 RIGHT JOIN t1 ON a=b;
+} {NULL NULL 11 22}
+do_execsql_test 19.3 {
+ SELECT *, '|' FROM t1 FULL JOIN (VALUES(33,44),(55,66)) AS t2 ON a=b
+ ORDER BY +column1
+} {11 22 NULL NULL | NULL NULL 33 44 | NULL NULL 55 66 |}
+do_execsql_test 19.4 {
+ SELECT *, '|' FROM (VALUES(33,44),(55,66)) AS t2 FULL JOIN t1 ON a=b
+ ORDER BY +column1
+} {NULL NULL 11 22 | 33 44 NULL NULL | 55 66 NULL NULL |}
+
+# 2024-04-21 dbsqlfuzz 6fd1ff3a64bef4a6c092e8d757548e95698b0df5
+# A continuation of the 2024-04-18 problem above. We have to create
+# Pseudo-cursor that is always NULL on the viaCoroutine loop in case
+# there are OP_Columns generated against it by the sub-WHERE clause.
+#
+db null N
+do_execsql_test 19.5 {
+ DROP TABLE IF EXISTS t1;
+ DROP TABLE IF EXISTS t2;
+ DROP TABLE IF EXISTS t3;
+ CREATE TABLE t1(a,b); INSERT INTO t1 VALUES(1,2);
+ CREATE TABLE t2(column1,column2); INSERT INTO t2 VALUES(11,22),(33,44);
+ CREATE TABLE t3(d,e); INSERT INTO t3 VALUES(3,4);
+}
+do_execsql_test 19.6 {
+ -- output verify using PG 14.2
+ SELECT *
+ FROM t1 CROSS JOIN t2 FULL JOIN t3 ON a=d
+ ORDER BY +d, +column1;
+} {1 2 11 22 N N
+ 1 2 33 44 N N
+ N N N N 3 4}
+do_execsql_test 19.7 {
+ SELECT *
+ FROM t1 CROSS JOIN (VALUES(11,22),(33,44)) FULL JOIN t3 ON a=d
+ ORDER BY +d, +column1;
+} {1 2 11 22 N N
+ 1 2 33 44 N N
+ N N N N 3 4}
+do_execsql_test 19.8 {
+ -- output verified using PG 14.2
+ SELECT *
+ FROM t1 CROSS JOIN t2 FULL JOIN t3 ON a=d
+ WHERE column1 IS NULL;
+} {N N N N 3 4}
+do_execsql_test 19.9 {
+ SELECT *
+ FROM t1 CROSS JOIN (VALUES(11,22),(33,44)) FULL JOIN t3 ON a=d
+ WHERE column1 IS NULL;
+} {N N N N 3 4}
+
+finish_test