7c492a250b
FossilOrigin-Name: b8442d2a6012b1f2e15381613267db0982e36bb4c748b15b56e668e0d0a3d0d2
716 lines
16 KiB
Plaintext
716 lines
16 KiB
Plaintext
# 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 fts3 {
|
|
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
|