0000: 23 20 32 30 31 34 20 4a 61 6e 75 61 72 79 20 31 # 2014 January 1
0010: 31 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 1.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c rce code. In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 ..# May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 ind forgiveness
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 .# May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 an you give..#.#
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0160: 2a 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66 *******.# This f
0170: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 ile implements r
0180: 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 egression tests
0190: 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61 for SQLite libra
01a0: 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73 ry. The.# focus
01b0: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 69 73 of this file is
01c0: 20 74 65 73 74 69 6e 67 20 74 68 65 20 57 49 54 testing the WIT
01d0: 48 20 63 6c 61 75 73 65 2e 0a 23 0a 0a 73 65 74 H clause..#..set
01e0: 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 testdir [file d
01f0: 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 irname $argv0].s
0200: 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 ource $testdir/t
0210: 65 73 74 65 72 2e 74 63 6c 0a 73 65 74 20 3a 3a ester.tcl.set ::
0220: 74 65 73 74 70 72 65 66 69 78 20 77 69 74 68 31 testprefix with1
0230: 0a 0a 69 66 63 61 70 61 62 6c 65 20 7b 21 63 74 ..ifcapable {!ct
0240: 65 7d 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 e} {. finish_te
0250: 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 64 st. return.}..d
0260: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 o_execsql_test 1
0270: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 .0 {. CREATE TA
0280: 42 4c 45 20 74 31 28 78 20 49 4e 54 45 47 45 52 BLE t1(x INTEGER
0290: 2c 20 79 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 , y INTEGER);.
02a0: 57 49 54 48 20 78 28 61 29 20 41 53 20 28 20 53 WITH x(a) AS ( S
02b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 29 ELECT * FROM t1)
02c0: 20 53 45 4c 45 43 54 20 31 30 0a 7d 20 7b 31 30 SELECT 10.} {10
02d0: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 }..do_execsql_te
02e0: 73 74 20 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43 st 1.1 {. SELEC
02f0: 54 20 2a 20 46 52 4f 4d 20 28 20 57 49 54 48 20 T * FROM ( WITH
0300: 78 20 41 53 20 28 20 53 45 4c 45 43 54 20 2a 20 x AS ( SELECT *
0310: 46 52 4f 4d 20 74 31 29 20 53 45 4c 45 43 54 20 FROM t1) SELECT
0320: 31 30 20 29 3b 0a 7d 20 7b 31 30 7d 0a 0a 64 6f 10 );.} {10}..do
0330: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e _execsql_test 1.
0340: 32 20 7b 0a 20 20 57 49 54 48 20 78 28 61 29 20 2 {. WITH x(a)
0350: 41 53 20 28 20 53 45 4c 45 43 54 20 2a 20 46 52 AS ( SELECT * FR
0360: 4f 4d 20 74 31 29 20 49 4e 53 45 52 54 20 49 4e OM t1) INSERT IN
0370: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32 TO t1 VALUES(1,2
0380: 29 3b 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 );.} {}..do_exec
0390: 73 71 6c 5f 74 65 73 74 20 31 2e 33 20 7b 0a 20 sql_test 1.3 {.
03a0: 20 57 49 54 48 20 78 28 61 29 20 41 53 20 28 20 WITH x(a) AS (
03b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 SELECT * FROM t1
03c0: 29 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 ) DELETE FROM t1
03d0: 3b 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 ;.} {}..do_execs
03e0: 71 6c 5f 74 65 73 74 20 31 2e 34 20 7b 0a 20 20 ql_test 1.4 {.
03f0: 57 49 54 48 20 78 28 61 29 20 41 53 20 28 20 53 WITH x(a) AS ( S
0400: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 29 ELECT * FROM t1)
0410: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 78 UPDATE t1 SET x
0420: 20 3d 20 79 3b 0a 7d 20 7b 7d 0a 20 0a 23 2d 2d = y;.} {}. .#--
0430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0470: 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 64 6f 5f 65 78 65 --------..do_exe
0480: 63 73 71 6c 5f 74 65 73 74 20 32 2e 31 20 7b 0a csql_test 2.1 {.
0490: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 DROP TABLE IF
04a0: 45 58 49 53 54 53 20 74 31 3b 0a 20 20 43 52 45 EXISTS t1;. CRE
04b0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b ATE TABLE t1(x);
04c0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 . INSERT INTO t
04d0: 31 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 49 1 VALUES(1);. I
04e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 NSERT INTO t1 VA
04f0: 4c 55 45 53 28 32 29 3b 0a 20 20 57 49 54 48 20 LUES(2);. WITH
0500: 74 6d 70 20 41 53 20 28 20 53 45 4c 45 43 54 20 tmp AS ( SELECT
0510: 2a 20 46 52 4f 4d 20 74 31 20 29 20 53 45 4c 45 * FROM t1 ) SELE
0520: 43 54 20 78 20 46 52 4f 4d 20 74 6d 70 3b 0a 7d CT x FROM tmp;.}
0530: 20 7b 31 20 32 7d 0a 0a 64 6f 5f 65 78 65 63 73 {1 2}..do_execs
0540: 71 6c 5f 74 65 73 74 20 32 2e 32 20 7b 0a 20 20 ql_test 2.2 {.
0550: 57 49 54 48 20 74 6d 70 28 61 29 20 41 53 20 28 WITH tmp(a) AS (
0560: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 SELECT * FROM t
0570: 31 20 29 20 53 45 4c 45 43 54 20 61 20 46 52 4f 1 ) SELECT a FRO
0580: 4d 20 74 6d 70 3b 0a 7d 20 7b 31 20 32 7d 0a 0a M tmp;.} {1 2}..
0590: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 do_execsql_test
05a0: 32 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 2.3 {. SELECT *
05b0: 20 46 52 4f 4d 20 28 0a 20 20 20 20 57 49 54 48 FROM (. WITH
05c0: 20 74 6d 70 28 61 29 20 41 53 20 28 20 53 45 4c tmp(a) AS ( SEL
05d0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 29 20 ECT * FROM t1 )
05e0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 6d SELECT a FROM tm
05f0: 70 0a 20 20 29 3b 0a 7d 20 7b 31 20 32 7d 0a 0a p. );.} {1 2}..
0600: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 do_execsql_test
0610: 32 2e 34 20 7b 0a 20 20 57 49 54 48 20 74 6d 70 2.4 {. WITH tmp
0620: 31 28 61 29 20 41 53 20 28 20 53 45 4c 45 43 54 1(a) AS ( SELECT
0630: 20 2a 20 46 52 4f 4d 20 74 31 20 29 2c 0a 20 20 * FROM t1 ),.
0640: 20 20 20 20 20 74 6d 70 32 28 78 29 20 41 53 20 tmp2(x) AS
0650: 28 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 ( SELECT * FROM
0660: 74 6d 70 31 29 0a 20 20 53 45 4c 45 43 54 20 2a tmp1). SELECT *
0670: 20 46 52 4f 4d 20 74 6d 70 32 3b 0a 7d 20 7b 31 FROM tmp2;.} {1
0680: 20 32 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 2}..do_execsql_
0690: 74 65 73 74 20 32 2e 35 20 7b 0a 20 20 57 49 54 test 2.5 {. WIT
06a0: 48 20 74 6d 70 32 28 78 29 20 41 53 20 28 20 53 H tmp2(x) AS ( S
06b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 6d 70 ELECT * FROM tmp
06c0: 31 29 2c 0a 20 20 20 20 20 20 20 74 6d 70 31 28 1),. tmp1(
06d0: 61 29 20 41 53 20 28 20 53 45 4c 45 43 54 20 2a a) AS ( SELECT *
06e0: 20 46 52 4f 4d 20 74 31 20 29 0a 20 20 53 45 4c FROM t1 ). SEL
06f0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 6d 70 32 3b ECT * FROM tmp2;
0700: 0a 7d 20 7b 31 20 32 7d 0a 0a 23 2d 2d 2d 2d 2d .} {1 2}..#-----
0710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0750: 2d 2d 2d 2d 0a 64 6f 5f 63 61 74 63 68 73 71 6c ----.do_catchsql
0760: 5f 74 65 73 74 20 33 2e 31 20 7b 0a 20 20 57 49 _test 3.1 {. WI
0770: 54 48 20 74 6d 70 32 28 78 29 20 41 53 20 28 20 TH tmp2(x) AS (
0780: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 6d SELECT * FROM tm
0790: 70 31 20 29 2c 0a 20 20 20 20 20 20 20 74 6d 70 p1 ),. tmp
07a0: 31 28 61 29 20 41 53 20 28 20 53 45 4c 45 43 54 1(a) AS ( SELECT
07b0: 20 2a 20 46 52 4f 4d 20 74 6d 70 32 20 29 0a 20 * FROM tmp2 ).
07c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 SELECT * FROM t
07d0: 6d 70 31 3b 0a 7d 20 7b 31 20 7b 63 69 72 63 75 mp1;.} {1 {circu
07e0: 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 74 lar reference: t
07f0: 6d 70 31 7d 7d 0a 0a 64 6f 5f 63 61 74 63 68 73 mp1}}..do_catchs
0800: 71 6c 5f 74 65 73 74 20 33 2e 32 20 7b 0a 20 20 ql_test 3.2 {.
0810: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 CREATE TABLE t2(
0820: 78 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 57 49 x INTEGER);. WI
0830: 54 48 20 74 6d 70 28 61 29 20 41 53 20 28 53 45 TH tmp(a) AS (SE
0840: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 29 2c LECT * FROM t1),
0850: 0a 20 20 20 20 20 20 20 74 6d 70 28 61 29 20 41 . tmp(a) A
0860: 53 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d S (SELECT * FROM
0870: 20 74 31 29 0a 20 20 53 45 4c 45 43 54 20 2a 20 t1). SELECT *
0880: 46 52 4f 4d 20 74 6d 70 3b 0a 7d 20 7b 31 20 7b FROM tmp;.} {1 {
0890: 64 75 70 6c 69 63 61 74 65 20 57 49 54 48 20 74 duplicate WITH t
08a0: 61 62 6c 65 20 6e 61 6d 65 3a 20 74 6d 70 7d 7d able name: tmp}}
08b0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 ..do_execsql_tes
08c0: 74 20 33 2e 33 20 7b 0a 20 20 43 52 45 41 54 45 t 3.3 {. CREATE
08d0: 20 54 41 42 4c 45 20 74 33 28 78 29 3b 0a 20 20 TABLE t3(x);.
08e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 CREATE TABLE t4(
08f0: 78 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e x);.. INSERT IN
0900: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27 54 33 TO t3 VALUES('T3
0910: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 ');. INSERT INT
0920: 4f 20 74 34 20 56 41 4c 55 45 53 28 27 54 34 27 O t4 VALUES('T4'
0930: 29 3b 0a 0a 20 20 57 49 54 48 20 74 33 28 61 29 );.. WITH t3(a)
0940: 20 41 53 20 28 53 45 4c 45 43 54 20 2a 20 46 52 AS (SELECT * FR
0950: 4f 4d 20 74 34 29 0a 20 20 53 45 4c 45 43 54 20 OM t4). SELECT
0960: 2a 20 46 52 4f 4d 20 74 33 3b 0a 7d 20 7b 54 34 * FROM t3;.} {T4
0970: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 }..do_execsql_te
0980: 73 74 20 33 2e 34 20 7b 0a 20 20 57 49 54 48 20 st 3.4 {. WITH
0990: 74 6d 70 20 20 41 53 20 28 20 53 45 4c 45 43 54 tmp AS ( SELECT
09a0: 20 2a 20 46 52 4f 4d 20 74 33 20 29 2c 0a 20 20 * FROM t3 ),.
09b0: 20 20 20 20 20 74 6d 70 32 20 41 53 20 28 20 57 tmp2 AS ( W
09c0: 49 54 48 20 74 6d 70 20 41 53 20 28 20 53 45 4c ITH tmp AS ( SEL
09d0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 20 29 20 ECT * FROM t4 )
09e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 6d SELECT * FROM tm
09f0: 70 20 29 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 p ). SELECT * F
0a00: 52 4f 4d 20 74 6d 70 32 3b 0a 7d 20 7b 54 34 7d ROM tmp2;.} {T4}
0a10: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 ..do_execsql_tes
0a20: 74 20 33 2e 35 20 7b 0a 20 20 57 49 54 48 20 74 t 3.5 {. WITH t
0a30: 6d 70 20 20 41 53 20 28 20 53 45 4c 45 43 54 20 mp AS ( SELECT
0a40: 2a 20 46 52 4f 4d 20 74 33 20 29 2c 0a 20 20 20 * FROM t3 ),.
0a50: 20 20 20 20 74 6d 70 32 20 41 53 20 28 20 57 49 tmp2 AS ( WI
0a60: 54 48 20 78 78 78 78 20 41 53 20 28 20 53 45 4c TH xxxx AS ( SEL
0a70: 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 20 29 20 ECT * FROM t4 )
0a80: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 6d SELECT * FROM tm
0a90: 70 20 29 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 p ). SELECT * F
0aa0: 52 4f 4d 20 74 6d 70 32 3b 0a 7d 20 7b 54 33 7d ROM tmp2;.} {T3}
0ab0: 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 ..do_catchsql_te
0ac0: 73 74 20 33 2e 36 20 7b 0a 20 20 57 49 54 48 20 st 3.6 {. WITH
0ad0: 74 6d 70 20 41 53 20 28 20 53 45 4c 45 43 54 20 tmp AS ( SELECT
0ae0: 2a 20 46 52 4f 4d 20 74 33 20 29 2c 0a 20 20 53 * FROM t3 ),. S
0af0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 6d 70 ELECT * FROM tmp
0b00: 3b 0a 7d 20 7b 31 20 7b 6e 65 61 72 20 22 53 45 ;.} {1 {near "SE
0b10: 4c 45 43 54 22 3a 20 73 79 6e 74 61 78 20 65 72 LECT": syntax er
0b20: 72 6f 72 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d ror}}..#--------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b70: 2d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 -.do_execsql_tes
0b80: 74 20 34 2e 31 20 7b 0a 20 20 44 52 4f 50 20 54 t 4.1 {. DROP T
0b90: 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 ABLE IF EXISTS t
0ba0: 31 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 1;. CREATE TABL
0bb0: 45 20 74 31 28 78 29 3b 0a 20 20 49 4e 53 45 52 E t1(x);. INSER
0bc0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 T INTO t1 VALUES
0bd0: 28 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e (1);. INSERT IN
0be0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 29 3b TO t1 VALUES(2);
0bf0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 . INSERT INTO t
0c00: 31 20 56 41 4c 55 45 53 28 33 29 3b 0a 20 20 49 1 VALUES(3);. I
0c10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 NSERT INTO t1 VA
0c20: 4c 55 45 53 28 34 29 3b 0a 0a 20 20 57 49 54 48 LUES(4);.. WITH
0c30: 20 64 73 65 74 20 41 53 20 28 20 53 45 4c 45 43 dset AS ( SELEC
0c40: 54 20 32 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 T 2 UNION ALL SE
0c50: 4c 45 43 54 20 34 20 29 0a 20 20 44 45 4c 45 54 LECT 4 ). DELET
0c60: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 E FROM t1 WHERE
0c70: 78 20 49 4e 20 64 73 65 74 3b 0a 20 20 53 45 4c x IN dset;. SEL
0c80: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d ECT * FROM t1;.}
0c90: 20 7b 31 20 33 7d 0a 0a 64 6f 5f 65 78 65 63 73 {1 3}..do_execs
0ca0: 71 6c 5f 74 65 73 74 20 34 2e 32 20 7b 0a 20 20 ql_test 4.2 {.
0cb0: 57 49 54 48 20 69 73 65 74 20 41 53 20 28 20 53 WITH iset AS ( S
0cc0: 45 4c 45 43 54 20 32 20 55 4e 49 4f 4e 20 41 4c ELECT 2 UNION AL
0cd0: 4c 20 53 45 4c 45 43 54 20 34 20 29 0a 20 20 49 L SELECT 4 ). I
0ce0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 NSERT INTO t1 SE
0cf0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 69 73 65 74 LECT * FROM iset
0d00: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f ;. SELECT * FRO
0d10: 4d 20 74 31 3b 0a 7d 20 7b 31 20 33 20 32 20 34 M t1;.} {1 3 2 4
0d20: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 }..do_execsql_te
0d30: 73 74 20 34 2e 33 20 7b 0a 20 20 57 49 54 48 20 st 4.3 {. WITH
0d40: 75 73 65 74 28 61 2c 20 62 29 20 41 53 20 28 20 uset(a, b) AS (
0d50: 53 45 4c 45 43 54 20 32 2c 20 38 20 55 4e 49 4f SELECT 2, 8 UNIO
0d60: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 34 2c 20 N ALL SELECT 4,
0d70: 39 20 29 0a 20 20 55 50 44 41 54 45 20 74 31 20 9 ). UPDATE t1
0d80: 53 45 54 20 78 20 3d 20 43 4f 41 4c 45 53 43 45 SET x = COALESCE
0d90: 28 20 28 53 45 4c 45 43 54 20 62 20 46 52 4f 4d ( (SELECT b FROM
0da0: 20 75 73 65 74 20 57 48 45 52 45 20 61 3d 78 29 uset WHERE a=x)
0db0: 2c 20 78 20 29 3b 0a 20 20 53 45 4c 45 43 54 20 , x );. SELECT
0dc0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 * FROM t1;.} {1
0dd0: 33 20 38 20 39 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 3 8 9}..#-------
0de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e20: 2d 2d 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f --.#.do_execsql_
0e30: 74 65 73 74 20 35 2e 31 20 7b 0a 20 20 57 49 54 test 5.1 {. WIT
0e40: 48 20 69 28 78 29 20 41 53 20 28 20 56 41 4c 55 H i(x) AS ( VALU
0e50: 45 53 28 31 29 20 55 4e 49 4f 4e 20 41 4c 4c 20 ES(1) UNION ALL
0e60: 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 SELECT x+1 FROM
0e70: 69 29 0a 20 20 53 45 4c 45 43 54 20 78 20 46 52 i). SELECT x FR
0e80: 4f 4d 20 69 20 4c 49 4d 49 54 20 31 30 3b 0a 7d OM i LIMIT 10;.}
0e90: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 {1 2 3 4 5 6 7
0ea0: 38 20 39 20 31 30 7d 0a 0a 64 6f 5f 63 61 74 63 8 9 10}..do_catc
0eb0: 68 73 71 6c 5f 74 65 73 74 20 35 2e 32 20 7b 0a hsql_test 5.2 {.
0ec0: 20 20 57 49 54 48 20 69 28 78 29 20 41 53 20 28 WITH i(x) AS (
0ed0: 20 56 41 4c 55 45 53 28 31 29 20 55 4e 49 4f 4e VALUES(1) UNION
0ee0: 20 41 4c 4c 20 53 45 4c 45 43 54 20 78 2b 31 20 ALL SELECT x+1
0ef0: 46 52 4f 4d 20 69 20 4f 52 44 45 52 20 42 59 20 FROM i ORDER BY
0f00: 31 29 0a 20 20 53 45 4c 45 43 54 20 78 20 46 52 1). SELECT x FR
0f10: 4f 4d 20 69 20 4c 49 4d 49 54 20 31 30 3b 0a 7d OM i LIMIT 10;.}
0f20: 20 7b 30 20 7b 31 20 32 20 33 20 34 20 35 20 36 {0 {1 2 3 4 5 6
0f30: 20 37 20 38 20 39 20 31 30 7d 7d 0a 0a 64 6f 5f 7 8 9 10}}..do_
0f40: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e 32 execsql_test 5.2
0f50: 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 .1 {. CREATE TA
0f60: 42 4c 45 20 65 64 67 65 28 78 66 72 6f 6d 2c 20 BLE edge(xfrom,
0f70: 78 74 6f 2c 20 73 65 71 2c 20 50 52 49 4d 41 52 xto, seq, PRIMAR
0f80: 59 20 4b 45 59 28 78 66 72 6f 6d 2c 20 78 74 6f Y KEY(xfrom, xto
0f90: 29 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 )) WITHOUT ROWID
0fa0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 ;. INSERT INTO
0fb0: 65 64 67 65 20 56 41 4c 55 45 53 28 30 2c 20 31 edge VALUES(0, 1
0fc0: 2c 20 31 30 29 3b 0a 20 20 49 4e 53 45 52 54 20 , 10);. INSERT
0fd0: 49 4e 54 4f 20 65 64 67 65 20 56 41 4c 55 45 53 INTO edge VALUES
0fe0: 28 31 2c 20 32 2c 20 32 30 29 3b 0a 20 20 49 4e (1, 2, 20);. IN
0ff0: 53 45 52 54 20 49 4e 54 4f 20 65 64 67 65 20 56 SERT INTO edge V
1000: 41 4c 55 45 53 28 30 2c 20 33 2c 20 33 30 29 3b ALUES(0, 3, 30);
1010: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 . INSERT INTO e
1020: 64 67 65 20 56 41 4c 55 45 53 28 32 2c 20 34 2c dge VALUES(2, 4,
1030: 20 34 30 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 40);. INSERT I
1040: 4e 54 4f 20 65 64 67 65 20 56 41 4c 55 45 53 28 NTO edge VALUES(
1050: 33 2c 20 34 2c 20 34 30 29 3b 0a 20 20 49 4e 53 3, 4, 40);. INS
1060: 45 52 54 20 49 4e 54 4f 20 65 64 67 65 20 56 41 ERT INTO edge VA
1070: 4c 55 45 53 28 32 2c 20 35 2c 20 35 30 29 3b 0a LUES(2, 5, 50);.
1080: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 64 INSERT INTO ed
1090: 67 65 20 56 41 4c 55 45 53 28 33 2c 20 36 2c 20 ge VALUES(3, 6,
10a0: 36 30 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 60);. INSERT IN
10b0: 54 4f 20 65 64 67 65 20 56 41 4c 55 45 53 28 35 TO edge VALUES(5
10c0: 2c 20 37 2c 20 37 30 29 3b 0a 20 20 49 4e 53 45 , 7, 70);. INSE
10d0: 52 54 20 49 4e 54 4f 20 65 64 67 65 20 56 41 4c RT INTO edge VAL
10e0: 55 45 53 28 33 2c 20 37 2c 20 37 30 29 3b 0a 20 UES(3, 7, 70);.
10f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 64 67 INSERT INTO edg
1100: 65 20 56 41 4c 55 45 53 28 34 2c 20 38 2c 20 38 e VALUES(4, 8, 8
1110: 30 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 0);. INSERT INT
1120: 4f 20 65 64 67 65 20 56 41 4c 55 45 53 28 37 2c O edge VALUES(7,
1130: 20 38 2c 20 38 30 29 3b 0a 20 20 49 4e 53 45 52 8, 80);. INSER
1140: 54 20 49 4e 54 4f 20 65 64 67 65 20 56 41 4c 55 T INTO edge VALU
1150: 45 53 28 38 2c 20 39 2c 20 39 30 29 3b 0a 20 20 ES(8, 9, 90);.
1160: 0a 20 20 57 49 54 48 20 52 45 43 55 52 53 49 56 . WITH RECURSIV
1170: 45 0a 20 20 20 20 61 6e 63 65 73 74 28 69 64 2c E. ancest(id,
1180: 20 6d 74 69 6d 65 29 20 41 53 0a 20 20 20 20 20 mtime) AS.
1190: 20 28 56 41 4c 55 45 53 28 30 2c 20 30 29 0a 20 (VALUES(0, 0).
11a0: 20 20 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 UNION.
11b0: 20 20 20 53 45 4c 45 43 54 20 65 64 67 65 2e 78 SELECT edge.x
11c0: 74 6f 2c 20 65 64 67 65 2e 73 65 71 20 46 52 4f to, edge.seq FRO
11d0: 4d 20 65 64 67 65 2c 20 61 6e 63 65 73 74 0a 20 M edge, ancest.
11e0: 20 20 20 20 20 20 20 57 48 45 52 45 20 65 64 67 WHERE edg
11f0: 65 2e 78 66 72 6f 6d 3d 61 6e 63 65 73 74 2e 69 e.xfrom=ancest.i
1200: 64 0a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 d. ORDER
1210: 42 59 20 32 0a 20 20 20 20 20 20 29 0a 20 20 53 BY 2. ). S
1220: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 6e 63 ELECT * FROM anc
1230: 65 73 74 3b 0a 7d 20 7b 30 20 30 20 31 20 31 30 est;.} {0 0 1 10
1240: 20 32 20 32 30 20 33 20 33 30 20 34 20 34 30 20 2 20 3 30 4 40
1250: 35 20 35 30 20 36 20 36 30 20 37 20 37 30 20 38 5 50 6 60 7 70 8
1260: 20 38 30 20 39 20 39 30 7d 0a 64 6f 5f 65 78 65 80 9 90}.do_exe
1270: 63 73 71 6c 5f 74 65 73 74 20 35 2e 32 2e 32 20 csql_test 5.2.2
1280: 7b 0a 20 20 57 49 54 48 20 52 45 43 55 52 53 49 {. WITH RECURSI
1290: 56 45 0a 20 20 20 20 61 6e 63 65 73 74 28 69 64 VE. ancest(id
12a0: 2c 20 6d 74 69 6d 65 29 20 41 53 0a 20 20 20 20 , mtime) AS.
12b0: 20 20 28 56 41 4c 55 45 53 28 30 2c 20 30 29 0a (VALUES(0, 0).
12c0: 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c UNION ALL
12d0: 0a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 65 . SELECT e
12e0: 64 67 65 2e 78 74 6f 2c 20 65 64 67 65 2e 73 65 dge.xto, edge.se
12f0: 71 20 46 52 4f 4d 20 65 64 67 65 2c 20 61 6e 63 q FROM edge, anc
1300: 65 73 74 0a 20 20 20 20 20 20 20 20 57 48 45 52 est. WHER
1310: 45 20 65 64 67 65 2e 78 66 72 6f 6d 3d 61 6e 63 E edge.xfrom=anc
1320: 65 73 74 2e 69 64 0a 20 20 20 20 20 20 20 20 4f est.id. O
1330: 52 44 45 52 20 42 59 20 32 0a 20 20 20 20 20 20 RDER BY 2.
1340: 29 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f ). SELECT * FRO
1350: 4d 20 61 6e 63 65 73 74 3b 0a 7d 20 7b 30 20 30 M ancest;.} {0 0
1360: 20 31 20 31 30 20 32 20 32 30 20 33 20 33 30 20 1 10 2 20 3 30
1370: 34 20 34 30 20 34 20 34 30 20 35 20 35 30 20 36 4 40 4 40 5 50 6
1380: 20 36 30 20 37 20 37 30 20 37 20 37 30 20 38 20 60 7 70 7 70 8
1390: 38 30 20 38 20 38 30 20 38 20 38 30 20 38 20 38 80 8 80 8 80 8 8
13a0: 30 20 39 20 39 30 20 39 20 39 30 20 39 20 39 30 0 9 90 9 90 9 90
13b0: 20 39 20 39 30 7d 0a 64 6f 5f 65 78 65 63 73 71 9 90}.do_execsq
13c0: 6c 5f 74 65 73 74 20 35 2e 32 2e 33 20 7b 0a 20 l_test 5.2.3 {.
13d0: 20 57 49 54 48 20 52 45 43 55 52 53 49 56 45 0a WITH RECURSIVE.
13e0: 20 20 20 20 61 6e 63 65 73 74 28 69 64 2c 20 6d ancest(id, m
13f0: 74 69 6d 65 29 20 41 53 0a 20 20 20 20 20 20 28 time) AS. (
1400: 56 41 4c 55 45 53 28 30 2c 20 30 29 0a 20 20 20 VALUES(0, 0).
1410: 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 UNION ALL.
1420: 20 20 20 20 20 53 45 4c 45 43 54 20 65 64 67 65 SELECT edge
1430: 2e 78 74 6f 2c 20 65 64 67 65 2e 73 65 71 20 46 .xto, edge.seq F
1440: 52 4f 4d 20 65 64 67 65 2c 20 61 6e 63 65 73 74 ROM edge, ancest
1450: 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 20 65 . WHERE e
1460: 64 67 65 2e 78 66 72 6f 6d 3d 61 6e 63 65 73 74 dge.xfrom=ancest
1470: 2e 69 64 0a 20 20 20 20 20 20 20 20 4f 52 44 45 .id. ORDE
1480: 52 20 42 59 20 32 20 4c 49 4d 49 54 20 34 20 4f R BY 2 LIMIT 4 O
1490: 46 46 53 45 54 20 32 0a 20 20 20 20 20 20 29 0a FFSET 2. ).
14a0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 SELECT * FROM
14b0: 61 6e 63 65 73 74 3b 0a 7d 20 7b 32 20 32 30 20 ancest;.} {2 20
14c0: 33 20 33 30 20 34 20 34 30 20 34 20 34 30 7d 0a 3 30 4 40 4 40}.
14d0: 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 .do_catchsql_tes
14e0: 74 20 35 2e 33 20 7b 0a 20 20 57 49 54 48 20 69 t 5.3 {. WITH i
14f0: 28 78 29 20 41 53 20 28 20 56 41 4c 55 45 53 28 (x) AS ( VALUES(
1500: 31 29 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 1) UNION ALL SEL
1510: 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 69 20 4c ECT x+1 FROM i L
1520: 49 4d 49 54 20 35 29 0a 20 20 53 45 4c 45 43 54 IMIT 5). SELECT
1530: 20 78 20 46 52 4f 4d 20 69 3b 0a 7d 20 7b 30 20 x FROM i;.} {0
1540: 7b 31 20 32 20 33 20 34 20 35 7d 7d 0a 0a 64 6f {1 2 3 4 5}}..do
1550: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e _execsql_test 5.
1560: 34 20 7b 0a 20 20 57 49 54 48 20 69 28 78 29 20 4 {. WITH i(x)
1570: 41 53 20 28 20 56 41 4c 55 45 53 28 31 29 20 55 AS ( VALUES(1) U
1580: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 NION ALL SELECT
1590: 28 78 2b 31 29 25 31 30 20 46 52 4f 4d 20 69 29 (x+1)%10 FROM i)
15a0: 0a 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d . SELECT x FROM
15b0: 20 69 20 4c 49 4d 49 54 20 32 30 3b 0a 7d 20 7b i LIMIT 20;.} {
15c0: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 1 2 3 4 5 6 7 8
15d0: 39 20 30 20 31 20 32 20 33 20 34 20 35 20 36 20 9 0 1 2 3 4 5 6
15e0: 37 20 38 20 39 20 30 7d 0a 0a 64 6f 5f 65 78 65 7 8 9 0}..do_exe
15f0: 63 73 71 6c 5f 74 65 73 74 20 35 2e 35 20 7b 0a csql_test 5.5 {.
1600: 20 20 57 49 54 48 20 69 28 78 29 20 41 53 20 28 WITH i(x) AS (
1610: 20 56 41 4c 55 45 53 28 31 29 20 55 4e 49 4f 4e VALUES(1) UNION
1620: 20 53 45 4c 45 43 54 20 28 78 2b 31 29 25 31 30 SELECT (x+1)%10
1630: 20 46 52 4f 4d 20 69 29 0a 20 20 53 45 4c 45 43 FROM i). SELEC
1640: 54 20 78 20 46 52 4f 4d 20 69 20 4c 49 4d 49 54 T x FROM i LIMIT
1650: 20 32 30 3b 0a 7d 20 7b 31 20 32 20 33 20 34 20 20;.} {1 2 3 4
1660: 35 20 36 20 37 20 38 20 39 20 30 7d 0a 0a 64 6f 5 6 7 8 9 0}..do
1670: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 35 _catchsql_test 5
1680: 2e 36 2e 31 20 7b 0a 20 20 57 49 54 48 20 69 28 .6.1 {. WITH i(
1690: 78 2c 20 79 29 20 41 53 20 28 20 56 41 4c 55 45 x, y) AS ( VALUE
16a0: 53 28 31 29 20 29 0a 20 20 53 45 4c 45 43 54 20 S(1) ). SELECT
16b0: 2a 20 46 52 4f 4d 20 69 3b 0a 7d 20 7b 31 20 7b * FROM i;.} {1 {
16c0: 74 61 62 6c 65 20 69 20 68 61 73 20 31 20 76 61 table i has 1 va
16d0: 6c 75 65 73 20 66 6f 72 20 32 20 63 6f 6c 75 6d lues for 2 colum
16e0: 6e 73 7d 7d 0a 0a 64 6f 5f 63 61 74 63 68 73 71 ns}}..do_catchsq
16f0: 6c 5f 74 65 73 74 20 35 2e 36 2e 32 20 7b 0a 20 l_test 5.6.2 {.
1700: 20 57 49 54 48 20 69 28 78 29 20 41 53 20 28 20 WITH i(x) AS (
1710: 56 41 4c 55 45 53 28 31 2c 32 29 20 29 0a 20 20 VALUES(1,2) ).
1720: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 69 3b SELECT * FROM i;
1730: 0a 7d 20 7b 31 20 7b 74 61 62 6c 65 20 69 20 68 .} {1 {table i h
1740: 61 73 20 32 20 76 61 6c 75 65 73 20 66 6f 72 20 as 2 values for
1750: 31 20 63 6f 6c 75 6d 6e 73 7d 7d 0a 0a 64 6f 5f 1 columns}}..do_
1760: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 35 2e catchsql_test 5.
1770: 36 2e 33 20 7b 0a 20 20 43 52 45 41 54 45 20 54 6.3 {. CREATE T
1780: 41 42 4c 45 20 74 35 28 61 2c 20 62 29 3b 0a 20 ABLE t5(a, b);.
1790: 20 57 49 54 48 20 69 28 78 29 20 41 53 20 28 20 WITH i(x) AS (
17a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 35 SELECT * FROM t5
17b0: 20 29 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 ). SELECT * FR
17c0: 4f 4d 20 69 3b 0a 7d 20 7b 31 20 7b 74 61 62 6c OM i;.} {1 {tabl
17d0: 65 20 69 20 68 61 73 20 32 20 76 61 6c 75 65 73 e i has 2 values
17e0: 20 66 6f 72 20 31 20 63 6f 6c 75 6d 6e 73 7d 7d for 1 columns}}
17f0: 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 ..do_catchsql_te
1800: 73 74 20 35 2e 36 2e 34 20 7b 0a 20 20 57 49 54 st 5.6.4 {. WIT
1810: 48 20 69 28 78 29 20 41 53 20 28 20 53 45 4c 45 H i(x) AS ( SELE
1820: 43 54 20 31 2c 20 32 20 55 4e 49 4f 4e 20 41 4c CT 1, 2 UNION AL
1830: 4c 20 53 45 4c 45 43 54 20 31 20 29 0a 20 20 53 L SELECT 1 ). S
1840: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 69 3b 0a ELECT * FROM i;.
1850: 7d 20 7b 31 20 7b 74 61 62 6c 65 20 69 20 68 61 } {1 {table i ha
1860: 73 20 32 20 76 61 6c 75 65 73 20 66 6f 72 20 31 s 2 values for 1
1870: 20 63 6f 6c 75 6d 6e 73 7d 7d 0a 0a 64 6f 5f 63 columns}}..do_c
1880: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 35 2e 36 atchsql_test 5.6
1890: 2e 35 20 7b 0a 20 20 57 49 54 48 20 69 28 78 29 .5 {. WITH i(x)
18a0: 20 41 53 20 28 20 53 45 4c 45 43 54 20 31 20 55 AS ( SELECT 1 U
18b0: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 NION ALL SELECT
18c0: 31 2c 20 32 20 29 0a 20 20 53 45 4c 45 43 54 20 1, 2 ). SELECT
18d0: 2a 20 46 52 4f 4d 20 69 3b 0a 7d 20 7b 31 20 7b * FROM i;.} {1 {
18e0: 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c SELECTs to the l
18f0: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 eft and right of
1900: 20 55 4e 49 4f 4e 20 41 4c 4c 20 64 6f 20 6e 6f UNION ALL do no
1910: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 t have the same
1920: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 number of result
1930: 20 63 6f 6c 75 6d 6e 73 7d 7d 0a 0a 64 6f 5f 63 columns}}..do_c
1940: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 35 2e 36 atchsql_test 5.6
1950: 2e 36 20 7b 0a 20 20 57 49 54 48 20 69 28 78 29 .6 {. WITH i(x)
1960: 20 41 53 20 28 20 53 45 4c 45 43 54 20 31 20 55 AS ( SELECT 1 U
1970: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 NION ALL SELECT
1980: 78 2b 31 2c 20 78 2a 32 20 46 52 4f 4d 20 69 20 x+1, x*2 FROM i
1990: 29 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f ). SELECT * FRO
19a0: 4d 20 69 3b 0a 7d 20 7b 31 20 7b 53 45 4c 45 43 M i;.} {1 {SELEC
19b0: 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 Ts to the left a
19c0: 6e 64 20 72 69 67 68 74 20 6f 66 20 55 4e 49 4f nd right of UNIO
19d0: 4e 20 41 4c 4c 20 64 6f 20 6e 6f 74 20 68 61 76 N ALL do not hav
19e0: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 e the same numbe
19f0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 r of result colu
1a00: 6d 6e 73 7d 7d 0a 0a 64 6f 5f 63 61 74 63 68 73 mns}}..do_catchs
1a10: 71 6c 5f 74 65 73 74 20 35 2e 36 2e 37 20 7b 0a ql_test 5.6.7 {.
1a20: 20 20 57 49 54 48 20 69 28 78 29 20 41 53 20 28 WITH i(x) AS (
1a30: 20 53 45 4c 45 43 54 20 31 2c 20 32 20 55 4e 49 SELECT 1, 2 UNI
1a40: 4f 4e 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 ON SELECT x+1 FR
1a50: 4f 4d 20 69 20 29 0a 20 20 53 45 4c 45 43 54 20 OM i ). SELECT
1a60: 2a 20 46 52 4f 4d 20 69 3b 0a 7d 20 7b 31 20 7b * FROM i;.} {1 {
1a70: 74 61 62 6c 65 20 69 20 68 61 73 20 32 20 76 61 table i has 2 va
1a80: 6c 75 65 73 20 66 6f 72 20 31 20 63 6f 6c 75 6d lues for 1 colum
1a90: 6e 73 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d ns}}..#---------
1aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ae0: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 .#.do_execsql_te
1af0: 73 74 20 36 2e 31 20 7b 0a 20 20 43 52 45 41 54 st 6.1 {. CREAT
1b00: 45 20 54 41 42 4c 45 20 66 28 0a 20 20 20 20 20 E TABLE f(.
1b10: 20 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d id INTEGER PRIM
1b20: 41 52 59 20 4b 45 59 2c 20 70 61 72 65 6e 74 69 ARY KEY, parenti
1b30: 64 20 52 45 46 45 52 45 4e 43 45 53 20 66 2c 20 d REFERENCES f,
1b40: 6e 61 6d 65 20 54 45 58 54 0a 20 20 29 3b 0a 0a name TEXT. );..
1b50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 20 INSERT INTO f
1b60: 56 41 4c 55 45 53 28 30 2c 20 4e 55 4c 4c 2c 20 VALUES(0, NULL,
1b70: 27 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e '');. INSERT IN
1b80: 54 4f 20 66 20 56 41 4c 55 45 53 28 31 2c 20 30 TO f VALUES(1, 0
1b90: 2c 20 27 62 69 6e 27 29 3b 0a 20 20 20 20 49 4e , 'bin');. IN
1ba0: 53 45 52 54 20 49 4e 54 4f 20 66 20 56 41 4c 55 SERT INTO f VALU
1bb0: 45 53 28 32 2c 20 31 2c 20 27 74 72 75 65 27 29 ES(2, 1, 'true')
1bc0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 ;. INSERT INT
1bd0: 4f 20 66 20 56 41 4c 55 45 53 28 33 2c 20 31 2c O f VALUES(3, 1,
1be0: 20 27 66 61 6c 73 65 27 29 3b 0a 20 20 20 20 49 'false');. I
1bf0: 4e 53 45 52 54 20 49 4e 54 4f 20 66 20 56 41 4c NSERT INTO f VAL
1c00: 55 45 53 28 34 2c 20 31 2c 20 27 6c 73 27 29 3b UES(4, 1, 'ls');
1c10: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f . INSERT INTO
1c20: 20 66 20 56 41 4c 55 45 53 28 35 2c 20 31 2c 20 f VALUES(5, 1,
1c30: 27 67 72 65 70 27 29 3b 0a 20 20 49 4e 53 45 52 'grep');. INSER
1c40: 54 20 49 4e 54 4f 20 66 20 56 41 4c 55 45 53 28 T INTO f VALUES(
1c50: 36 2c 20 30 2c 20 27 65 74 63 27 29 3b 0a 20 20 6, 0, 'etc');.
1c60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 20 INSERT INTO f
1c70: 56 41 4c 55 45 53 28 37 2c 20 36 2c 20 27 72 63 VALUES(7, 6, 'rc
1c80: 2e 64 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 .d');. INSE
1c90: 52 54 20 49 4e 54 4f 20 66 20 56 41 4c 55 45 53 RT INTO f VALUES
1ca0: 28 38 2c 20 37 2c 20 27 72 63 2e 61 70 61 63 68 (8, 7, 'rc.apach
1cb0: 65 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 e');. INSER
1cc0: 54 20 49 4e 54 4f 20 66 20 56 41 4c 55 45 53 28 T INTO f VALUES(
1cd0: 39 2c 20 37 2c 20 27 72 63 2e 73 61 6d 62 61 27 9, 7, 'rc.samba'
1ce0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f );. INSERT INTO
1cf0: 20 66 20 56 41 4c 55 45 53 28 31 30 2c 20 30 2c f VALUES(10, 0,
1d00: 20 27 68 6f 6d 65 27 29 3b 0a 20 20 20 20 49 4e 'home');. IN
1d10: 53 45 52 54 20 49 4e 54 4f 20 66 20 56 41 4c 55 SERT INTO f VALU
1d20: 45 53 28 31 31 2c 20 31 30 2c 20 27 64 61 6e 27 ES(11, 10, 'dan'
1d30: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 );. INSERT
1d40: 49 4e 54 4f 20 66 20 56 41 4c 55 45 53 28 31 32 INTO f VALUES(12
1d50: 2c 20 31 31 2c 20 27 70 75 62 6c 69 63 5f 68 74 , 11, 'public_ht
1d60: 6d 6c 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e ml');. IN
1d70: 53 45 52 54 20 49 4e 54 4f 20 66 20 56 41 4c 55 SERT INTO f VALU
1d80: 45 53 28 31 33 2c 20 31 32 2c 20 27 69 6e 64 65 ES(13, 12, 'inde
1d90: 78 2e 68 74 6d 6c 27 29 3b 0a 20 20 20 20 20 20 x.html');.
1da0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 INSERT INTO
1db0: 66 20 56 41 4c 55 45 53 28 31 34 2c 20 31 33 2c f VALUES(14, 13,
1dc0: 20 27 6c 6f 67 6f 2e 67 69 66 27 29 3b 0a 7d 0a 'logo.gif');.}.
1dd0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 .do_execsql_test
1de0: 20 36 2e 32 20 7b 0a 20 20 57 49 54 48 20 66 6c 6.2 {. WITH fl
1df0: 61 74 28 66 69 64 2c 20 66 70 61 74 68 29 20 41 at(fid, fpath) A
1e00: 53 20 28 0a 20 20 20 20 53 45 4c 45 43 54 20 69 S (. SELECT i
1e10: 64 2c 20 27 27 20 46 52 4f 4d 20 66 20 57 48 45 d, '' FROM f WHE
1e20: 52 45 20 70 61 72 65 6e 74 69 64 20 49 53 20 4e RE parentid IS N
1e30: 55 4c 4c 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c ULL. UNION AL
1e40: 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 69 64 2c L. SELECT id,
1e50: 20 66 70 61 74 68 20 7c 7c 20 27 2f 27 20 7c 7c fpath || '/' ||
1e60: 20 6e 61 6d 65 20 46 52 4f 4d 20 66 2c 20 66 6c name FROM f, fl
1e70: 61 74 20 57 48 45 52 45 20 70 61 72 65 6e 74 69 at WHERE parenti
1e80: 64 3d 66 69 64 0a 20 20 29 0a 20 20 53 45 4c 45 d=fid. ). SELE
1e90: 43 54 20 66 70 61 74 68 20 46 52 4f 4d 20 66 6c CT fpath FROM fl
1ea0: 61 74 20 57 48 45 52 45 20 66 70 61 74 68 21 3d at WHERE fpath!=
1eb0: 27 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 7d '' ORDER BY 1;.}
1ec0: 20 7b 0a 20 20 2f 62 69 6e 20 0a 20 20 2f 62 69 {. /bin . /bi
1ed0: 6e 2f 66 61 6c 73 65 20 2f 62 69 6e 2f 67 72 65 n/false /bin/gre
1ee0: 70 20 2f 62 69 6e 2f 6c 73 20 2f 62 69 6e 2f 74 p /bin/ls /bin/t
1ef0: 72 75 65 20 0a 20 20 2f 65 74 63 20 0a 20 20 2f rue . /etc . /
1f00: 65 74 63 2f 72 63 2e 64 20 0a 20 20 2f 65 74 63 etc/rc.d . /etc
1f10: 2f 72 63 2e 64 2f 72 63 2e 61 70 61 63 68 65 20 /rc.d/rc.apache
1f20: 2f 65 74 63 2f 72 63 2e 64 2f 72 63 2e 73 61 6d /etc/rc.d/rc.sam
1f30: 62 61 20 0a 20 20 2f 68 6f 6d 65 20 0a 20 20 2f ba . /home . /
1f40: 68 6f 6d 65 2f 64 61 6e 20 0a 20 20 2f 68 6f 6d home/dan . /hom
1f50: 65 2f 64 61 6e 2f 70 75 62 6c 69 63 5f 68 74 6d e/dan/public_htm
1f60: 6c 20 0a 20 20 2f 68 6f 6d 65 2f 64 61 6e 2f 70 l . /home/dan/p
1f70: 75 62 6c 69 63 5f 68 74 6d 6c 2f 69 6e 64 65 78 ublic_html/index
1f80: 2e 68 74 6d 6c 20 0a 20 20 2f 68 6f 6d 65 2f 64 .html . /home/d
1f90: 61 6e 2f 70 75 62 6c 69 63 5f 68 74 6d 6c 2f 69 an/public_html/i
1fa0: 6e 64 65 78 2e 68 74 6d 6c 2f 6c 6f 67 6f 2e 67 ndex.html/logo.g
1fb0: 69 66 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c if.}..do_execsql
1fc0: 5f 74 65 73 74 20 36 2e 33 20 7b 0a 20 20 57 49 _test 6.3 {. WI
1fd0: 54 48 20 66 6c 61 74 28 66 69 64 2c 20 66 70 61 TH flat(fid, fpa
1fe0: 74 68 29 20 41 53 20 28 0a 20 20 20 20 53 45 4c th) AS (. SEL
1ff0: 45 43 54 20 69 64 2c 20 27 27 20 46 52 4f 4d 20 ECT id, '' FROM
2000: 66 20 57 48 45 52 45 20 70 61 72 65 6e 74 69 64 f WHERE parentid
2010: 20 49 53 20 4e 55 4c 4c 0a 20 20 20 20 55 4e 49 IS NULL. UNI
2020: 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 ON ALL. SELEC
2030: 54 20 69 64 2c 20 66 70 61 74 68 20 7c 7c 20 27 T id, fpath || '
2040: 2f 27 20 7c 7c 20 6e 61 6d 65 20 46 52 4f 4d 20 /' || name FROM
2050: 66 2c 20 66 6c 61 74 20 57 48 45 52 45 20 70 61 f, flat WHERE pa
2060: 72 65 6e 74 69 64 3d 66 69 64 0a 20 20 29 0a 20 rentid=fid. ).
2070: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 SELECT count(*)
2080: 20 46 52 4f 4d 20 66 6c 61 74 3b 0a 7d 20 7b 31 FROM flat;.} {1
2090: 35 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 5}..do_execsql_t
20a0: 65 73 74 20 36 2e 34 20 7b 0a 20 20 57 49 54 48 est 6.4 {. WITH
20b0: 20 78 28 69 29 20 41 53 20 28 0a 20 20 20 20 53 x(i) AS (. S
20c0: 45 4c 45 43 54 20 31 0a 20 20 20 20 55 4e 49 4f ELECT 1. UNIO
20d0: 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 N ALL. SELECT
20e0: 20 69 2b 31 20 46 52 4f 4d 20 78 20 57 48 45 52 i+1 FROM x WHER
20f0: 45 20 69 3c 31 30 0a 20 20 29 0a 20 20 53 45 4c E i<10. ). SEL
2100: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f ECT count(*) FRO
2110: 4d 20 78 0a 7d 20 7b 31 30 7d 0a 0a 0a 23 2d 2d M x.} {10}...#--
2120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2160: 2d 2d 2d 2d 2d 2d 2d 0a 0a 64 6f 5f 65 78 65 63 -------..do_exec
2170: 73 71 6c 5f 74 65 73 74 20 37 2e 31 20 7b 0a 20 sql_test 7.1 {.
2180: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 CREATE TABLE tr
2190: 65 65 28 69 2c 20 70 29 3b 0a 20 20 49 4e 53 45 ee(i, p);. INSE
21a0: 52 54 20 49 4e 54 4f 20 74 72 65 65 20 56 41 4c RT INTO tree VAL
21b0: 55 45 53 28 31 2c 20 4e 55 4c 4c 29 3b 0a 20 20 UES(1, NULL);.
21c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 65 65 INSERT INTO tree
21d0: 20 56 41 4c 55 45 53 28 32 2c 20 31 29 3b 0a 20 VALUES(2, 1);.
21e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 65 INSERT INTO tre
21f0: 65 20 56 41 4c 55 45 53 28 33 2c 20 31 29 3b 0a e VALUES(3, 1);.
2200: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 INSERT INTO tr
2210: 65 65 20 56 41 4c 55 45 53 28 34 2c 20 32 29 3b ee VALUES(4, 2);
2220: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 . INSERT INTO t
2230: 72 65 65 20 56 41 4c 55 45 53 28 35 2c 20 34 29 ree VALUES(5, 4)
2240: 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f ;.}..do_execsql_
2250: 74 65 73 74 20 37 2e 32 20 7b 0a 20 20 57 49 54 test 7.2 {. WIT
2260: 48 20 74 28 69 64 2c 20 70 61 74 68 29 20 41 53 H t(id, path) AS
2270: 20 28 0a 20 20 20 20 53 45 4c 45 43 54 20 69 2c (. SELECT i,
2280: 20 27 27 20 46 52 4f 4d 20 74 72 65 65 20 57 48 '' FROM tree WH
2290: 45 52 45 20 70 20 49 53 20 4e 55 4c 4c 0a 20 20 ERE p IS NULL.
22a0: 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 UNION ALL.
22b0: 53 45 4c 45 43 54 20 69 2c 20 70 61 74 68 20 7c SELECT i, path |
22c0: 7c 20 27 2f 27 20 7c 7c 20 69 20 46 52 4f 4d 20 | '/' || i FROM
22d0: 74 72 65 65 2c 20 74 20 57 48 45 52 45 20 70 20 tree, t WHERE p
22e0: 3d 20 69 64 0a 20 20 29 20 0a 20 20 53 45 4c 45 = id. ) . SELE
22f0: 43 54 20 70 61 74 68 20 46 52 4f 4d 20 74 3b 0a CT path FROM t;.
2300: 7d 20 7b 7b 7d 20 2f 32 20 2f 33 20 2f 32 2f 34 } {{} /2 /3 /2/4
2310: 20 2f 32 2f 34 2f 35 7d 0a 0a 64 6f 5f 65 78 65 /2/4/5}..do_exe
2320: 63 73 71 6c 5f 74 65 73 74 20 37 2e 33 20 7b 0a csql_test 7.3 {.
2330: 20 20 57 49 54 48 20 74 28 69 64 29 20 41 53 20 WITH t(id) AS
2340: 28 0a 20 20 20 20 56 41 4c 55 45 53 28 32 29 0a (. VALUES(2).
2350: 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 UNION ALL.
2360: 20 20 53 45 4c 45 43 54 20 69 20 46 52 4f 4d 20 SELECT i FROM
2370: 74 72 65 65 2c 20 74 20 57 48 45 52 45 20 70 20 tree, t WHERE p
2380: 3d 20 69 64 0a 20 20 29 20 0a 20 20 53 45 4c 45 = id. ) . SELE
2390: 43 54 20 69 64 20 46 52 4f 4d 20 74 3b 0a 7d 20 CT id FROM t;.}
23a0: 7b 32 20 34 20 35 7d 0a 0a 64 6f 5f 63 61 74 63 {2 4 5}..do_catc
23b0: 68 73 71 6c 5f 74 65 73 74 20 37 2e 34 20 7b 0a hsql_test 7.4 {.
23c0: 20 20 57 49 54 48 20 74 28 69 64 29 20 41 53 20 WITH t(id) AS
23d0: 28 0a 20 20 20 20 56 41 4c 55 45 53 28 32 29 0a (. VALUES(2).
23e0: 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 UNION ALL.
23f0: 20 20 53 45 4c 45 43 54 20 69 20 46 52 4f 4d 20 SELECT i FROM
2400: 74 72 65 65 20 57 48 45 52 45 20 70 20 49 4e 20 tree WHERE p IN
2410: 28 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 (SELECT id FROM
2420: 74 29 0a 20 20 29 20 0a 20 20 53 45 4c 45 43 54 t). ) . SELECT
2430: 20 69 64 20 46 52 4f 4d 20 74 3b 0a 7d 20 7b 31 id FROM t;.} {1
2440: 20 7b 72 65 63 75 72 73 69 76 65 20 72 65 66 65 {recursive refe
2450: 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75 rence in a subqu
2460: 65 72 79 3a 20 74 7d 7d 0a 0a 64 6f 5f 63 61 74 ery: t}}..do_cat
2470: 63 68 73 71 6c 5f 74 65 73 74 20 37 2e 35 20 7b chsql_test 7.5 {
2480: 0a 20 20 57 49 54 48 20 74 28 69 64 29 20 41 53 . WITH t(id) AS
2490: 20 28 0a 20 20 20 20 56 41 4c 55 45 53 28 32 29 (. VALUES(2)
24a0: 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 . UNION ALL.
24b0: 20 20 20 53 45 4c 45 43 54 20 69 20 46 52 4f 4d SELECT i FROM
24c0: 20 74 72 65 65 2c 20 74 20 57 48 45 52 45 20 70 tree, t WHERE p
24d0: 20 3d 20 69 64 20 41 4e 44 20 70 20 49 4e 20 28 = id AND p IN (
24e0: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 SELECT id FROM t
24f0: 29 0a 20 20 29 20 0a 20 20 53 45 4c 45 43 54 20 ). ) . SELECT
2500: 69 64 20 46 52 4f 4d 20 74 3b 0a 7d 20 7b 31 20 id FROM t;.} {1
2510: 7b 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 {multiple recurs
2520: 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 ive references:
2530: 74 7d 7d 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c t}}..do_catchsql
2540: 5f 74 65 73 74 20 37 2e 36 20 7b 0a 20 20 57 49 _test 7.6 {. WI
2550: 54 48 20 74 28 69 64 29 20 41 53 20 28 0a 20 20 TH t(id) AS (.
2560: 20 20 53 45 4c 45 43 54 20 69 20 46 52 4f 4d 20 SELECT i FROM
2570: 74 72 65 65 20 57 48 45 52 45 20 32 20 49 4e 20 tree WHERE 2 IN
2580: 28 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 (SELECT id FROM
2590: 74 29 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c t). UNION ALL
25a0: 0a 20 20 20 20 53 45 4c 45 43 54 20 69 20 46 52 . SELECT i FR
25b0: 4f 4d 20 74 72 65 65 2c 20 74 20 57 48 45 52 45 OM tree, t WHERE
25c0: 20 70 20 3d 20 69 64 0a 20 20 29 20 0a 20 20 53 p = id. ) . S
25d0: 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 3b ELECT id FROM t;
25e0: 0a 7d 20 7b 31 20 7b 63 69 72 63 75 6c 61 72 20 .} {1 {circular
25f0: 72 65 66 65 72 65 6e 63 65 3a 20 74 7d 7d 0a 0a reference: t}}..
2600: 23 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 # Compute the ma
2610: 6e 64 65 6c 62 72 6f 74 20 73 65 74 20 75 73 69 ndelbrot set usi
2620: 6e 67 20 61 20 72 65 63 75 72 73 69 76 65 20 71 ng a recursive q
2630: 75 65 72 79 0a 23 0a 64 6f 5f 65 78 65 63 73 71 uery.#.do_execsq
2640: 6c 5f 74 65 73 74 20 38 2e 31 2d 6d 61 6e 64 65 l_test 8.1-mande
2650: 6c 62 72 6f 74 20 7b 0a 20 20 57 49 54 48 20 52 lbrot {. WITH R
2660: 45 43 55 52 53 49 56 45 0a 20 20 20 20 78 61 78 ECURSIVE. xax
2670: 69 73 28 78 29 20 41 53 20 28 56 41 4c 55 45 53 is(x) AS (VALUES
2680: 28 2d 32 2e 30 29 20 55 4e 49 4f 4e 20 41 4c 4c (-2.0) UNION ALL
2690: 20 53 45 4c 45 43 54 20 78 2b 30 2e 30 35 20 46 SELECT x+0.05 F
26a0: 52 4f 4d 20 78 61 78 69 73 20 57 48 45 52 45 20 ROM xaxis WHERE
26b0: 78 3c 31 2e 32 29 2c 0a 20 20 20 20 79 61 78 69 x<1.2),. yaxi
26c0: 73 28 79 29 20 41 53 20 28 56 41 4c 55 45 53 28 s(y) AS (VALUES(
26d0: 2d 31 2e 30 29 20 55 4e 49 4f 4e 20 41 4c 4c 20 -1.0) UNION ALL
26e0: 53 45 4c 45 43 54 20 79 2b 30 2e 31 20 46 52 4f SELECT y+0.1 FRO
26f0: 4d 20 79 61 78 69 73 20 57 48 45 52 45 20 79 3c M yaxis WHERE y<
2700: 31 2e 30 29 2c 0a 20 20 20 20 6d 28 69 74 65 72 1.0),. m(iter
2710: 2c 20 63 78 2c 20 63 79 2c 20 78 2c 20 79 29 20 , cx, cy, x, y)
2720: 41 53 20 28 0a 20 20 20 20 20 20 53 45 4c 45 43 AS (. SELEC
2730: 54 20 30 2c 20 78 2c 20 79 2c 20 30 2e 30 2c 20 T 0, x, y, 0.0,
2740: 30 2e 30 20 46 52 4f 4d 20 78 61 78 69 73 2c 20 0.0 FROM xaxis,
2750: 79 61 78 69 73 0a 20 20 20 20 20 20 55 4e 49 4f yaxis. UNIO
2760: 4e 20 41 4c 4c 0a 20 20 20 20 20 20 53 45 4c 45 N ALL. SELE
2770: 43 54 20 69 74 65 72 2b 31 2c 20 63 78 2c 20 63 CT iter+1, cx, c
2780: 79 2c 20 78 2a 78 2d 79 2a 79 20 2b 20 63 78 2c y, x*x-y*y + cx,
2790: 20 32 2e 30 2a 78 2a 79 20 2b 20 63 79 20 46 52 2.0*x*y + cy FR
27a0: 4f 4d 20 6d 20 0a 20 20 20 20 20 20 20 57 48 45 OM m . WHE
27b0: 52 45 20 28 78 2a 78 20 2b 20 79 2a 79 29 20 3c RE (x*x + y*y) <
27c0: 20 34 2e 30 20 41 4e 44 20 69 74 65 72 3c 32 38 4.0 AND iter<28
27d0: 0a 20 20 20 20 29 2c 0a 20 20 20 20 6d 32 28 69 . ),. m2(i
27e0: 74 65 72 2c 20 63 78 2c 20 63 79 29 20 41 53 20 ter, cx, cy) AS
27f0: 28 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 6d (. SELECT m
2800: 61 78 28 69 74 65 72 29 2c 20 63 78 2c 20 63 79 ax(iter), cx, cy
2810: 20 46 52 4f 4d 20 6d 20 47 52 4f 55 50 20 42 59 FROM m GROUP BY
2820: 20 63 78 2c 20 63 79 0a 20 20 20 20 29 2c 0a 20 cx, cy. ),.
2830: 20 20 20 61 28 74 29 20 41 53 20 28 0a 20 20 20 a(t) AS (.
2840: 20 20 20 53 45 4c 45 43 54 20 67 72 6f 75 70 5f SELECT group_
2850: 63 6f 6e 63 61 74 28 20 73 75 62 73 74 72 28 27 concat( substr('
2860: 20 2e 2b 2a 23 27 2c 20 31 2b 6d 69 6e 28 69 74 .+*#', 1+min(it
2870: 65 72 2f 37 2c 34 29 2c 20 31 29 2c 20 27 27 29 er/7,4), 1), '')
2880: 20 0a 20 20 20 20 20 20 46 52 4f 4d 20 6d 32 20 . FROM m2
2890: 47 52 4f 55 50 20 42 59 20 63 79 0a 20 20 20 20 GROUP BY cy.
28a0: 29 0a 20 20 53 45 4c 45 43 54 20 67 72 6f 75 70 ). SELECT group
28b0: 5f 63 6f 6e 63 61 74 28 72 74 72 69 6d 28 74 29 _concat(rtrim(t)
28c0: 2c 78 27 30 61 27 29 20 46 52 4f 4d 20 61 3b 0a ,x'0a') FROM a;.
28d0: 7d 20 7b 7b 20 20 20 20 20 20 20 20 20 20 20 20 } {{
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28f0: 20 20 20 20 20 20 20 20 2e 2e 2e 2e 23 0a 20 20 ....#.
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2920: 20 2e 2e 23 2a 2e 2e 0a 20 20 20 20 20 20 20 20 ..#*...
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2940: 20 20 20 20 20 20 20 20 20 2e 2e 2b 23 23 23 23 ..+####
2950: 2b 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 +..
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e .
2970: 2e 2e 2e 2e 2e 2e 2b 23 23 23 23 2e 2e 2e 2e 20 ......+####....
2980: 20 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 +.
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e .
29a0: 2e 23 23 2b 2a 23 23 23 23 23 23 23 23 23 23 2b .##+*##########+
29b0: 2e 2b 2b 2b 2b 0a 20 20 20 20 20 20 20 20 20 20 .++++.
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
29d0: 2e 2b 2e 23 23 23 23 23 23 23 23 23 23 23 23 23 .+.#############
29e0: 23 23 23 23 23 2b 2e 0a 20 20 20 20 20 20 20 20 #####+..
29f0: 20 20 20 20 20 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ..........
2a00: 2e 2e 2e 2b 23 23 23 23 23 23 23 23 23 23 23 23 ...+############
2a10: 23 23 23 23 23 23 23 2b 2e 2b 0a 20 20 20 20 20 #######+.+.
2a20: 20 20 20 20 20 20 20 20 20 2e 2e 2b 2b 2e 2e 23 ..++..#
2a30: 2e 2e 2e 2e 2e 2a 23 23 23 23 23 23 23 23 23 23 .....*##########
2a40: 23 23 23 23 23 23 23 23 23 23 23 2b 2e 0a 20 20 ###########+..
2a50: 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 2b 23 ...+#
2a60: 23 23 23 23 23 23 2b 2b 23 23 23 23 23 23 23 23 ######++########
2a70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 2e ###############.
2a80: 0a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 2e 2b . ....+
2a90: 2a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 *###############
2aa0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
2ab0: 23 2e 0a 20 23 23 23 23 23 23 23 23 23 23 23 23 #.. ############
2ac0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
2ad0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
2ae0: 23 2e 2e 2e 0a 20 20 20 20 20 20 20 20 20 20 2e #.... .
2af0: 2e 2e 2e 2b 2a 23 23 23 23 23 23 23 23 23 23 23 ...+*###########
2b00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
2b10: 23 23 23 23 23 2e 0a 20 20 20 20 20 20 20 20 20 #####..
2b20: 20 20 20 20 2e 2e 2e 2b 23 23 23 23 23 23 23 2b ...+#######+
2b30: 2b 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 +###############
2b40: 23 23 23 23 23 23 23 23 2e 0a 20 20 20 20 20 20 ########..
2b50: 20 20 20 20 20 20 20 20 2e 2e 2b 2b 2e 2e 23 2e ..++..#.
2b60: 2e 2e 2e 2e 2a 23 23 23 23 23 23 23 23 23 23 23 ....*###########
2b70: 23 23 23 23 23 23 23 23 23 23 2b 2e 0a 20 20 20 ##########+..
2b80: 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 2e 2e .....
2b90: 2e 2e 2e 2e 2e 2e 2e 2e 2b 23 23 23 23 23 23 23 ........+#######
2ba0: 23 23 23 23 23 23 23 23 23 23 23 23 2b 2e 2b 0a ############+.+.
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2bc0: 20 20 20 20 20 20 20 20 20 20 2e 2b 2e 23 23 23 .+.###
2bd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 2b ###############+
2be0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 23 ..#
2c00: 23 2b 2a 23 23 23 23 23 23 23 23 23 23 2b 2e 2b #+*##########+.+
2c10: 2b 2b 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 +++.
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2c30: 2e 2e 2e 2e 2e 2e 2e 2b 23 23 23 23 2e 2e 2e 2e .......+####....
2c40: 20 20 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 +.
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2c60: 20 20 20 20 20 20 2e 2e 2b 23 23 23 23 2b 2e 0a ..+####+..
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2c90: 20 20 20 2e 2e 23 2a 2e 2e 0a 20 20 20 20 20 20 ..#*...
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e ..
2cc0: 2e 2e 23 0a 20 20 20 20 20 20 20 20 20 20 20 20 ..#.
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ce0: 20 20 20 20 20 20 20 20 2b 2e 7d 7d 0a 0a 23 20 +.}}..#
2cf0: 53 6f 6c 76 65 20 61 20 73 75 64 6f 6b 75 20 70 Solve a sudoku p
2d00: 75 7a 7a 6c 65 20 75 73 69 6e 67 20 61 20 72 65 uzzle using a re
2d10: 63 75 72 73 69 76 65 20 71 75 65 72 79 0a 23 0a cursive query.#.
2d20: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 do_execsql_test
2d30: 38 2e 32 2d 73 6f 64 75 6b 6f 20 7b 0a 20 20 57 8.2-soduko {. W
2d40: 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 20 20 ITH RECURSIVE.
2d50: 20 20 69 6e 70 75 74 28 73 75 64 29 20 41 53 20 input(sud) AS
2d60: 28 0a 20 20 20 20 20 20 56 41 4c 55 45 53 28 27 (. VALUES('
2d70: 35 33 2e 2e 37 2e 2e 2e 2e 36 2e 2e 31 39 35 2e 53..7....6..195.
2d80: 2e 2e 2e 39 38 2e 2e 2e 2e 36 2e 38 2e 2e 2e 36 ...98....6.8...6
2d90: 2e 2e 2e 33 34 2e 2e 38 2e 33 2e 2e 31 37 2e 2e ...34..8.3..17..
2da0: 2e 32 2e 2e 2e 36 2e 36 2e 2e 2e 2e 32 38 2e 2e .2...6.6....28..
2db0: 2e 2e 34 31 39 2e 2e 35 2e 2e 2e 2e 38 2e 2e 37 ..419..5....8..7
2dc0: 39 27 29 0a 20 20 20 20 29 2c 0a 20 20 0a 20 20 9'). ),. .
2dd0: 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 66 69 6c /* A table fil
2de0: 6c 65 64 20 77 69 74 68 20 64 69 67 69 74 73 20 led with digits
2df0: 31 2e 2e 39 2c 20 69 6e 63 6c 75 73 69 76 65 2e 1..9, inclusive.
2e00: 20 2a 2f 0a 20 20 20 20 64 69 67 69 74 73 28 7a */. digits(z
2e10: 2c 20 6c 70 29 20 41 53 20 28 0a 20 20 20 20 20 , lp) AS (.
2e20: 20 56 41 4c 55 45 53 28 27 31 27 2c 20 31 29 0a VALUES('1', 1).
2e30: 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 UNION ALL
2e40: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 43 41 53 SELECT. CAS
2e50: 54 28 6c 70 2b 31 20 41 53 20 54 45 58 54 29 2c T(lp+1 AS TEXT),
2e60: 20 6c 70 2b 31 20 46 52 4f 4d 20 64 69 67 69 74 lp+1 FROM digit
2e70: 73 20 57 48 45 52 45 20 6c 70 3c 39 0a 20 20 20 s WHERE lp<9.
2e80: 20 29 2c 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 ),. . /* Th
2e90: 65 20 74 72 69 63 6b 79 20 62 69 74 2e 20 2a 2f e tricky bit. */
2ea0: 0a 20 20 20 20 78 28 73 2c 20 69 6e 64 29 20 41 . x(s, ind) A
2eb0: 53 20 28 0a 20 20 20 20 20 20 53 45 4c 45 43 54 S (. SELECT
2ec0: 20 73 75 64 2c 20 69 6e 73 74 72 28 73 75 64 2c sud, instr(sud,
2ed0: 20 27 2e 27 29 20 46 52 4f 4d 20 69 6e 70 75 74 '.') FROM input
2ee0: 0a 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c . UNION ALL
2ef0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 0a 20 20 . SELECT.
2f00: 20 20 20 20 20 20 73 75 62 73 74 72 28 73 2c 20 substr(s,
2f10: 31 2c 20 69 6e 64 2d 31 29 20 7c 7c 20 7a 20 7c 1, ind-1) || z |
2f20: 7c 20 73 75 62 73 74 72 28 73 2c 20 69 6e 64 2b | substr(s, ind+
2f30: 31 29 2c 0a 20 20 20 20 20 20 20 20 69 6e 73 74 1),. inst
2f40: 72 28 20 73 75 62 73 74 72 28 73 2c 20 31 2c 20 r( substr(s, 1,
2f50: 69 6e 64 2d 31 29 20 7c 7c 20 7a 20 7c 7c 20 73 ind-1) || z || s
2f60: 75 62 73 74 72 28 73 2c 20 69 6e 64 2b 31 29 2c ubstr(s, ind+1),
2f70: 20 27 2e 27 20 29 0a 20 20 20 20 20 20 20 46 52 '.' ). FR
2f80: 4f 4d 20 78 2c 20 64 69 67 69 74 73 20 41 53 20 OM x, digits AS
2f90: 7a 0a 20 20 20 20 20 20 57 48 45 52 45 20 69 6e z. WHERE in
2fa0: 64 3e 30 0a 20 20 20 20 20 20 20 20 41 4e 44 20 d>0. AND
2fb0: 4e 4f 54 20 45 58 49 53 54 53 20 28 0a 20 20 20 NOT EXISTS (.
2fc0: 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 SELEC
2fd0: 54 20 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 T 1.
2fe0: 20 20 20 20 46 52 4f 4d 20 64 69 67 69 74 73 20 FROM digits
2ff0: 41 53 20 6c 70 0a 20 20 20 20 20 20 20 20 20 20 AS lp.
3000: 20 20 20 20 20 57 48 45 52 45 20 7a 2e 7a 20 3d WHERE z.z =
3010: 20 73 75 62 73 74 72 28 73 2c 20 28 28 69 6e 64 substr(s, ((ind
3020: 2d 31 29 2f 39 29 2a 39 20 2b 20 6c 70 2c 20 31 -1)/9)*9 + lp, 1
3030: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ).
3040: 20 20 20 20 4f 52 20 7a 2e 7a 20 3d 20 73 75 62 OR z.z = sub
3050: 73 74 72 28 73 2c 20 28 28 69 6e 64 2d 31 29 25 str(s, ((ind-1)%
3060: 39 29 20 2b 20 28 6c 70 2d 31 29 2a 39 20 2b 20 9) + (lp-1)*9 +
3070: 31 2c 20 31 29 0a 20 20 20 20 20 20 20 20 20 20 1, 1).
3080: 20 20 20 20 20 20 20 20 4f 52 20 7a 2e 7a 20 3d OR z.z =
3090: 20 73 75 62 73 74 72 28 73 2c 20 28 28 28 69 6e substr(s, (((in
30a0: 64 2d 31 29 2f 33 29 20 25 20 33 29 20 2a 20 33 d-1)/3) % 3) * 3
30b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
30c0: 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 28 69 + ((i
30d0: 6e 64 2d 31 29 2f 32 37 29 20 2a 20 32 37 20 2b nd-1)/27) * 27 +
30e0: 20 6c 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 lp.
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 +
3100: 28 28 6c 70 2d 31 29 20 2f 20 33 29 20 2a 20 36 ((lp-1) / 3) * 6
3110: 2c 20 31 29 0a 20 20 20 20 20 20 20 20 20 20 20 , 1).
3120: 29 0a 20 20 20 20 29 0a 20 20 53 45 4c 45 43 54 ). ). SELECT
3130: 20 73 20 46 52 4f 4d 20 78 20 57 48 45 52 45 20 s FROM x WHERE
3140: 69 6e 64 3d 30 3b 0a 7d 20 7b 35 33 34 36 37 38 ind=0;.} {534678
3150: 39 31 32 36 37 32 31 39 35 33 34 38 31 39 38 33 9126721953481983
3160: 34 32 35 36 37 38 35 39 37 36 31 34 32 33 34 32 4256785976142342
3170: 36 38 35 33 37 39 31 37 31 33 39 32 34 38 35 36 6853791713924856
3180: 39 36 31 35 33 37 32 38 34 32 38 37 34 31 39 36 9615372842874196
3190: 33 35 33 34 35 32 38 36 31 37 39 7d 0a 0a 23 2d 35345286179}..#-
31a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 6f 6d 65 ---------.# Some
31f0: 20 74 65 73 74 73 20 74 68 61 74 20 75 73 65 20 tests that use
3200: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 LIMIT and OFFSET
3210: 20 69 6e 20 74 68 65 20 64 65 66 69 6e 69 74 69 in the definiti
3220: 6f 6e 20 6f 66 20 72 65 63 75 72 73 69 76 65 20 on of recursive
3230: 43 54 45 73 2e 0a 23 20 0a 73 65 74 20 49 20 5b CTEs..# .set I [
3240: 6c 69 73 74 20 31 20 32 20 33 20 34 20 35 20 36 list 1 2 3 4 5 6
3250: 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20 7 8 9 10 11 12
3260: 31 33 20 31 34 20 31 35 20 31 36 20 31 37 20 31 13 14 15 16 17 1
3270: 38 20 31 39 20 32 30 5d 0a 70 72 6f 63 20 6c 69 8 19 20].proc li
3280: 6d 69 74 5f 74 65 73 74 20 7b 74 6e 20 69 4c 69 mit_test {tn iLi
3290: 6d 69 74 20 69 4f 66 66 73 65 74 7d 20 7b 0a 20 mit iOffset} {.
32a0: 20 69 66 20 7b 24 69 4f 66 66 73 65 74 20 3c 20 if {$iOffset <
32b0: 30 7d 20 7b 20 73 65 74 20 69 4f 66 66 73 65 74 0} { set iOffset
32c0: 20 30 20 7d 0a 20 20 69 66 20 7b 24 69 4c 69 6d 0 }. if {$iLim
32d0: 69 74 20 3c 20 30 20 7d 20 7b 0a 20 20 20 20 73 it < 0 } {. s
32e0: 65 74 20 72 65 73 75 6c 74 20 5b 6c 72 61 6e 67 et result [lrang
32f0: 65 20 24 3a 3a 49 20 24 69 4f 66 66 73 65 74 20 e $::I $iOffset
3300: 65 6e 64 5d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a end]. } else {.
3310: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b set result [
3320: 6c 72 61 6e 67 65 20 24 3a 3a 49 20 24 69 4f 66 lrange $::I $iOf
3330: 66 73 65 74 20 5b 65 78 70 72 20 24 69 4c 69 6d fset [expr $iLim
3340: 69 74 2b 24 69 4f 66 66 73 65 74 2d 31 5d 5d 0a it+$iOffset-1]].
3350: 20 20 7d 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c }. uplevel [l
3360: 69 73 74 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 ist do_execsql_t
3370: 65 73 74 20 24 74 6e 20 5b 73 75 62 73 74 20 2d est $tn [subst -
3380: 6e 6f 63 6f 6d 6d 61 6e 64 73 20 7b 0a 20 20 20 nocommands {.
3390: 20 57 49 54 48 20 69 69 28 61 29 20 41 53 20 28 WITH ii(a) AS (
33a0: 0a 20 20 20 20 20 20 56 41 4c 55 45 53 28 31 29 . VALUES(1)
33b0: 0a 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c . UNION ALL
33c0: 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 . SELECT a
33d0: 2b 31 20 46 52 4f 4d 20 69 69 20 57 48 45 52 45 +1 FROM ii WHERE
33e0: 20 61 3c 32 30 20 0a 20 20 20 20 20 20 4c 49 4d a<20 . LIM
33f0: 49 54 20 24 69 4c 69 6d 69 74 20 4f 46 46 53 45 IT $iLimit OFFSE
3400: 54 20 24 69 4f 66 66 73 65 74 0a 20 20 20 20 29 T $iOffset. )
3410: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 . SELECT * FR
3420: 4f 4d 20 69 69 0a 20 20 7d 5d 20 24 72 65 73 75 OM ii. }] $resu
3430: 6c 74 5d 0a 7d 0a 0a 6c 69 6d 69 74 5f 74 65 73 lt].}..limit_tes
3440: 74 20 39 2e 31 20 20 20 20 32 30 20 20 30 0a 6c t 9.1 20 0.l
3450: 69 6d 69 74 5f 74 65 73 74 20 39 2e 32 20 20 20 imit_test 9.2
3460: 20 20 30 20 20 30 0a 6c 69 6d 69 74 5f 74 65 73 0 0.limit_tes
3470: 74 20 39 2e 33 20 20 20 20 31 39 20 20 31 0a 6c t 9.3 19 1.l
3480: 69 6d 69 74 5f 74 65 73 74 20 39 2e 34 20 20 20 imit_test 9.4
3490: 20 32 30 20 2d 31 0a 6c 69 6d 69 74 5f 74 65 73 20 -1.limit_tes
34a0: 74 20 39 2e 35 20 20 20 20 20 35 20 20 35 0a 6c t 9.5 5 5.l
34b0: 69 6d 69 74 5f 74 65 73 74 20 39 2e 36 20 20 20 imit_test 9.6
34c0: 20 20 30 20 2d 31 0a 6c 69 6d 69 74 5f 74 65 73 0 -1.limit_tes
34d0: 74 20 39 2e 37 20 20 20 20 34 30 20 2d 31 0a 6c t 9.7 40 -1.l
34e0: 69 6d 69 74 5f 74 65 73 74 20 39 2e 38 20 20 20 imit_test 9.8
34f0: 20 2d 31 20 2d 31 0a 6c 69 6d 69 74 5f 74 65 73 -1 -1.limit_tes
3500: 74 20 39 2e 39 20 20 20 20 2d 31 20 2d 31 0a 0a t 9.9 -1 -1..
3510: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d #---------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 -----------.# Te
3560: 73 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 st the ORDER BY
3570: 63 6c 61 75 73 65 20 6f 6e 20 72 65 63 75 72 73 clause on recurs
3580: 69 76 65 20 74 61 62 6c 65 73 2e 0a 23 0a 0a 64 ive tables..#..d
3590: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 o_execsql_test 1
35a0: 30 2e 31 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 0.1 {. DROP TAB
35b0: 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 72 65 LE IF EXISTS tre
35c0: 65 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c e;. CREATE TABL
35d0: 45 20 74 72 65 65 28 69 64 20 49 4e 54 45 47 45 E tree(id INTEGE
35e0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 70 R PRIMARY KEY, p
35f0: 61 72 65 6e 74 69 64 2c 20 70 61 79 6c 6f 61 64 arentid, payload
3600: 29 3b 0a 7d 0a 0a 70 72 6f 63 20 69 6e 73 65 72 );.}..proc inser
3610: 74 5f 69 6e 74 6f 5f 74 72 65 65 20 7b 4c 7d 20 t_into_tree {L}
3620: 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 44 45 {. db eval { DE
3630: 4c 45 54 45 20 46 52 4f 4d 20 74 72 65 65 20 7d LETE FROM tree }
3640: 0a 20 20 66 6f 72 65 61 63 68 20 6b 65 79 20 24 . foreach key $
3650: 4c 20 7b 0a 20 20 20 20 75 6e 73 65 74 20 2d 6e L {. unset -n
3660: 6f 63 6f 6d 70 6c 61 69 6e 20 70 61 72 65 6e 74 ocomplain parent
3670: 69 64 0a 20 20 20 20 66 6f 72 65 61 63 68 20 73 id. foreach s
3680: 65 67 20 5b 73 70 6c 69 74 20 24 6b 65 79 20 2f eg [split $key /
3690: 5d 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 24 73 ] {. if {$s
36a0: 65 67 3d 3d 22 22 7d 20 63 6f 6e 74 69 6e 75 65 eg==""} continue
36b0: 0a 20 20 20 20 20 20 73 65 74 20 69 64 20 5b 64 . set id [d
36c0: 62 20 6f 6e 65 20 7b 0a 20 20 20 20 20 20 20 20 b one {.
36d0: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 SELECT id FROM t
36e0: 72 65 65 20 57 48 45 52 45 20 70 61 72 65 6e 74 ree WHERE parent
36f0: 69 64 20 49 53 20 24 70 61 72 65 6e 74 69 64 20 id IS $parentid
3700: 41 4e 44 20 70 61 79 6c 6f 61 64 3d 24 73 65 67 AND payload=$seg
3710: 0a 20 20 20 20 20 20 7d 5d 0a 20 20 20 20 20 20 . }].
3720: 69 66 20 7b 24 69 64 3d 3d 22 22 7d 20 7b 0a 20 if {$id==""} {.
3730: 20 20 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b db eval {
3740: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 65 INSERT INTO tre
3750: 65 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 24 e VALUES(NULL, $
3760: 70 61 72 65 6e 74 69 64 2c 20 24 73 65 67 29 20 parentid, $seg)
3770: 7d 0a 20 20 20 20 20 20 20 20 73 65 74 20 70 61 }. set pa
3780: 72 65 6e 74 69 64 20 5b 64 62 20 6c 61 73 74 5f rentid [db last_
3790: 69 6e 73 65 72 74 5f 72 6f 77 69 64 5d 0a 20 20 insert_rowid].
37a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 } else {.
37b0: 20 20 20 20 20 73 65 74 20 70 61 72 65 6e 74 69 set parenti
37c0: 64 20 24 69 64 0a 20 20 20 20 20 20 7d 0a 20 20 d $id. }.
37d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 69 6e 73 65 72 }. }.}..inser
37e0: 74 5f 69 6e 74 6f 5f 74 72 65 65 20 7b 0a 20 20 t_into_tree {.
37f0: 2f 61 2f 61 2f 61 0a 20 20 2f 61 2f 62 2f 63 0a /a/a/a. /a/b/c.
3800: 20 20 2f 61 2f 62 2f 63 2f 64 0a 20 20 2f 61 2f /a/b/c/d. /a/
3810: 62 2f 64 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c b/d.}.do_execsql
3820: 5f 74 65 73 74 20 31 30 2e 32 20 7b 0a 20 20 57 _test 10.2 {. W
3830: 49 54 48 20 66 6c 61 74 28 66 69 64 2c 20 70 29 ITH flat(fid, p)
3840: 20 41 53 20 28 0a 20 20 20 20 53 45 4c 45 43 54 AS (. SELECT
3850: 20 69 64 2c 20 27 2f 27 20 7c 7c 20 70 61 79 6c id, '/' || payl
3860: 6f 61 64 20 46 52 4f 4d 20 74 72 65 65 20 57 48 oad FROM tree WH
3870: 45 52 45 20 70 61 72 65 6e 74 69 64 20 49 53 20 ERE parentid IS
3880: 4e 55 4c 4c 0a 20 20 20 20 55 4e 49 4f 4e 20 41 NULL. UNION A
3890: 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 69 64 LL. SELECT id
38a0: 2c 20 70 20 7c 7c 20 27 2f 27 20 7c 7c 20 70 61 , p || '/' || pa
38b0: 79 6c 6f 61 64 20 46 52 4f 4d 20 66 6c 61 74 2c yload FROM flat,
38c0: 20 74 72 65 65 20 57 48 45 52 45 20 70 61 72 65 tree WHERE pare
38d0: 6e 74 69 64 3d 66 69 64 0a 20 20 29 0a 20 20 53 ntid=fid. ). S
38e0: 45 4c 45 43 54 20 70 20 46 52 4f 4d 20 66 6c 61 ELECT p FROM fla
38f0: 74 20 4f 52 44 45 52 20 42 59 20 70 3b 0a 7d 20 t ORDER BY p;.}
3900: 7b 0a 20 20 2f 61 20 2f 61 2f 61 20 2f 61 2f 61 {. /a /a/a /a/a
3910: 2f 61 20 0a 20 20 20 20 20 2f 61 2f 62 20 2f 61 /a . /a/b /a
3920: 2f 62 2f 63 20 2f 61 2f 62 2f 63 2f 64 0a 20 20 /b/c /a/b/c/d.
3930: 20 20 20 20 20 20 20 20 2f 61 2f 62 2f 64 0a 7d /a/b/d.}
3940: 0a 0a 23 20 53 63 61 6e 20 74 68 65 20 74 72 65 ..# Scan the tre
3950: 65 2d 73 74 72 75 63 74 75 72 65 20 63 75 72 72 e-structure curr
3960: 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 ently stored in
3970: 74 61 62 6c 65 20 74 72 65 65 2e 20 52 65 74 75 table tree. Retu
3980: 72 6e 20 61 20 6c 69 73 74 0a 23 20 6f 66 20 6e rn a list.# of n
3990: 6f 64 65 73 20 76 69 73 69 74 65 64 2e 0a 23 0a odes visited..#.
39a0: 70 72 6f 63 20 73 63 61 6e 5f 74 72 65 65 20 7b proc scan_tree {
39b0: 62 44 65 70 74 68 46 69 72 73 74 20 62 52 65 76 bDepthFirst bRev
39c0: 65 72 73 65 7d 20 7b 0a 0a 20 20 73 65 74 20 6f erse} {.. set o
39d0: 72 64 65 72 20 22 4f 52 44 45 52 20 42 59 20 22 rder "ORDER BY "
39e0: 0a 20 20 69 66 20 7b 24 62 44 65 70 74 68 46 69 . if {$bDepthFi
39f0: 72 73 74 3d 3d 30 7d 20 7b 20 61 70 70 65 6e 64 rst==0} { append
3a00: 20 6f 72 64 65 72 20 22 32 20 41 53 43 2c 22 20 order "2 ASC,"
3a10: 7d 0a 20 20 69 66 20 7b 24 62 52 65 76 65 72 73 }. if {$bRevers
3a20: 65 3d 3d 30 7d 20 7b 20 0a 20 20 20 20 61 70 70 e==0} { . app
3a30: 65 6e 64 20 6f 72 64 65 72 20 22 20 33 20 41 53 end order " 3 AS
3a40: 43 22 20 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 C" . } else {.
3a50: 20 20 20 61 70 70 65 6e 64 20 6f 72 64 65 72 20 append order
3a60: 22 20 33 20 44 45 53 43 22 20 0a 20 20 7d 0a 0a " 3 DESC" . }..
3a70: 20 20 64 62 20 65 76 61 6c 20 22 0a 20 20 20 20 db eval ".
3a80: 57 49 54 48 20 66 6c 61 74 28 66 69 64 2c 20 64 WITH flat(fid, d
3a90: 65 70 74 68 2c 20 70 29 20 41 53 20 28 0a 20 20 epth, p) AS (.
3aa0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 69 64 2c SELECT id,
3ab0: 20 31 2c 20 27 2f 27 20 7c 7c 20 70 61 79 6c 6f 1, '/' || paylo
3ac0: 61 64 20 46 52 4f 4d 20 74 72 65 65 20 57 48 45 ad FROM tree WHE
3ad0: 52 45 20 70 61 72 65 6e 74 69 64 20 49 53 20 4e RE parentid IS N
3ae0: 55 4c 4c 0a 20 20 20 20 20 20 20 20 55 4e 49 4f ULL. UNIO
3af0: 4e 20 41 4c 4c 0a 20 20 20 20 20 20 20 20 53 45 N ALL. SE
3b00: 4c 45 43 54 20 69 64 2c 20 64 65 70 74 68 2b 31 LECT id, depth+1
3b10: 2c 20 70 7c 7c 27 2f 27 7c 7c 70 61 79 6c 6f 61 , p||'/'||payloa
3b20: 64 20 46 52 4f 4d 20 66 6c 61 74 2c 20 74 72 65 d FROM flat, tre
3b30: 65 20 57 48 45 52 45 20 70 61 72 65 6e 74 69 64 e WHERE parentid
3b40: 3d 66 69 64 0a 20 20 20 20 20 20 20 20 24 6f 72 =fid. $or
3b50: 64 65 72 0a 20 20 20 20 29 0a 20 20 20 20 53 45 der. ). SE
3b60: 4c 45 43 54 20 70 20 46 52 4f 4d 20 66 6c 61 74 LECT p FROM flat
3b70: 3b 0a 20 20 22 0a 7d 0a 0a 69 6e 73 65 72 74 5f ;. ".}..insert_
3b80: 69 6e 74 6f 5f 74 72 65 65 20 7b 0a 20 20 2f 61 into_tree {. /a
3b90: 2f 62 0a 20 20 2f 61 2f 62 2f 63 0a 20 20 2f 61 /b. /a/b/c. /a
3ba0: 2f 64 0a 20 20 2f 61 2f 64 2f 65 0a 20 20 2f 61 /d. /a/d/e. /a
3bb0: 2f 64 2f 66 0a 20 20 2f 67 2f 68 0a 7d 0a 0a 23 /d/f. /g/h.}..#
3bc0: 20 42 72 65 61 64 74 68 20 66 69 72 73 74 2c 20 Breadth first,
3bd0: 73 69 62 6c 69 6e 67 73 20 69 6e 20 61 73 63 65 siblings in asce
3be0: 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 23 0a 64 nding order..#.d
3bf0: 6f 5f 74 65 73 74 20 31 30 2e 33 20 7b 0a 20 20 o_test 10.3 {.
3c00: 73 63 61 6e 5f 74 72 65 65 20 30 20 30 0a 7d 20 scan_tree 0 0.}
3c10: 5b 6c 69 73 74 20 7b 2a 7d 7b 0a 20 20 2f 61 20 [list {*}{. /a
3c20: 2f 67 0a 20 20 2f 61 2f 62 20 2f 61 2f 64 20 2f /g. /a/b /a/d /
3c30: 67 2f 68 0a 20 20 2f 61 2f 62 2f 63 20 2f 61 2f g/h. /a/b/c /a/
3c40: 64 2f 65 20 2f 61 2f 64 2f 66 0a 7d 5d 0a 0a 23 d/e /a/d/f.}]..#
3c50: 20 44 65 70 74 68 20 66 69 72 73 74 2c 20 73 69 Depth first, si
3c60: 62 6c 69 6e 67 73 20 69 6e 20 61 73 63 65 6e 64 blings in ascend
3c70: 69 6e 67 20 6f 72 64 65 72 2e 0a 23 0a 64 6f 5f ing order..#.do_
3c80: 74 65 73 74 20 31 30 2e 34 20 7b 0a 20 20 73 63 test 10.4 {. sc
3c90: 61 6e 5f 74 72 65 65 20 31 20 30 0a 7d 20 5b 6c an_tree 1 0.} [l
3ca0: 69 73 74 20 7b 2a 7d 7b 0a 20 20 2f 61 20 2f 61 ist {*}{. /a /a
3cb0: 2f 62 20 2f 61 2f 62 2f 63 0a 20 20 20 20 20 2f /b /a/b/c. /
3cc0: 61 2f 64 20 2f 61 2f 64 2f 65 20 0a 20 20 20 20 a/d /a/d/e .
3cd0: 20 20 20 20 20 20 2f 61 2f 64 2f 66 0a 20 20 2f /a/d/f. /
3ce0: 67 20 2f 67 2f 68 0a 7d 5d 0a 0a 23 20 42 72 65 g /g/h.}]..# Bre
3cf0: 61 64 74 68 20 66 69 72 73 74 2c 20 73 69 62 6c adth first, sibl
3d00: 69 6e 67 73 20 69 6e 20 64 65 73 63 65 6e 64 69 ings in descendi
3d10: 6e 67 20 6f 72 64 65 72 2e 0a 23 0a 64 6f 5f 74 ng order..#.do_t
3d20: 65 73 74 20 31 30 2e 35 20 7b 0a 20 20 73 63 61 est 10.5 {. sca
3d30: 6e 5f 74 72 65 65 20 30 20 31 0a 7d 20 5b 6c 69 n_tree 0 1.} [li
3d40: 73 74 20 7b 2a 7d 7b 0a 20 20 2f 67 20 2f 61 20 st {*}{. /g /a
3d50: 0a 20 20 2f 67 2f 68 20 2f 61 2f 64 20 2f 61 2f . /g/h /a/d /a/
3d60: 62 20 0a 20 20 2f 61 2f 64 2f 66 20 2f 61 2f 64 b . /a/d/f /a/d
3d70: 2f 65 20 2f 61 2f 62 2f 63 20 0a 7d 5d 0a 0a 23 /e /a/b/c .}]..#
3d80: 20 44 65 70 74 68 20 66 69 72 73 74 2c 20 73 69 Depth first, si
3d90: 62 6c 69 6e 67 73 20 69 6e 20 61 73 63 65 6e 64 blings in ascend
3da0: 69 6e 67 20 6f 72 64 65 72 2e 0a 23 0a 64 6f 5f ing order..#.do_
3db0: 74 65 73 74 20 31 30 2e 36 20 7b 0a 20 20 73 63 test 10.6 {. sc
3dc0: 61 6e 5f 74 72 65 65 20 31 20 31 0a 7d 20 5b 6c an_tree 1 1.} [l
3dd0: 69 73 74 20 7b 2a 7d 7b 0a 20 20 2f 67 20 2f 67 ist {*}{. /g /g
3de0: 2f 68 0a 20 20 2f 61 20 2f 61 2f 64 20 2f 61 2f /h. /a /a/d /a/
3df0: 64 2f 66 20 0a 20 20 20 20 20 20 20 20 20 20 2f d/f . /
3e00: 61 2f 64 2f 65 20 0a 20 20 20 20 20 2f 61 2f 62 a/d/e . /a/b
3e10: 20 2f 61 2f 62 2f 63 0a 7d 5d 0a 0a 0a 23 20 54 /a/b/c.}]...# T
3e20: 65 73 74 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 est name resolut
3e30: 69 6f 6e 20 69 6e 20 4f 52 44 45 52 20 42 59 20 ion in ORDER BY
3e40: 63 6c 61 75 73 65 73 2e 0a 23 0a 64 6f 5f 63 61 clauses..#.do_ca
3e50: 74 63 68 73 71 6c 5f 74 65 73 74 20 31 30 2e 37 tchsql_test 10.7
3e60: 2e 31 20 7b 0a 20 20 57 49 54 48 20 74 28 61 29 .1 {. WITH t(a)
3e70: 20 41 53 20 28 0a 20 20 20 20 53 45 4c 45 43 54 AS (. SELECT
3e80: 20 31 20 41 53 20 62 20 55 4e 49 4f 4e 20 41 4c 1 AS b UNION AL
3e90: 4c 20 53 45 4c 45 43 54 20 61 2b 31 20 41 53 20 L SELECT a+1 AS
3ea0: 63 20 46 52 4f 4d 20 74 20 57 48 45 52 45 20 61 c FROM t WHERE a
3eb0: 3c 35 20 4f 52 44 45 52 20 42 59 20 61 0a 20 20 <5 ORDER BY a.
3ec0: 29 20 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 ) . SELECT * FR
3ed0: 4f 4d 20 74 0a 7d 20 7b 31 20 7b 31 73 74 20 4f OM t.} {1 {1st O
3ee0: 52 44 45 52 20 42 59 20 74 65 72 6d 20 64 6f 65 RDER BY term doe
3ef0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 s not match any
3f00: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 column in the re
3f10: 73 75 6c 74 20 73 65 74 7d 7d 0a 64 6f 5f 65 78 sult set}}.do_ex
3f20: 65 63 73 71 6c 5f 74 65 73 74 20 31 30 2e 37 2e ecsql_test 10.7.
3f30: 32 20 7b 0a 20 20 57 49 54 48 20 74 28 61 29 20 2 {. WITH t(a)
3f40: 41 53 20 28 0a 20 20 20 20 53 45 4c 45 43 54 20 AS (. SELECT
3f50: 31 20 41 53 20 62 20 55 4e 49 4f 4e 20 41 4c 4c 1 AS b UNION ALL
3f60: 20 53 45 4c 45 43 54 20 61 2b 31 20 41 53 20 63 SELECT a+1 AS c
3f70: 20 46 52 4f 4d 20 74 20 57 48 45 52 45 20 61 3c FROM t WHERE a<
3f80: 35 20 4f 52 44 45 52 20 42 59 20 62 0a 20 20 29 5 ORDER BY b. )
3f90: 20 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f . SELECT * FRO
3fa0: 4d 20 74 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 M t.} {1 2 3 4 5
3fb0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 }.do_execsql_tes
3fc0: 74 20 31 30 2e 37 2e 33 20 7b 0a 20 20 57 49 54 t 10.7.3 {. WIT
3fd0: 48 20 74 28 61 29 20 41 53 20 28 0a 20 20 20 20 H t(a) AS (.
3fe0: 53 45 4c 45 43 54 20 31 20 41 53 20 62 20 55 4e SELECT 1 AS b UN
3ff0: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 61 ION ALL SELECT a
4000: 2b 31 20 41 53 20 63 20 46 52 4f 4d 20 74 20 57 +1 AS c FROM t W
4010: 48 45 52 45 20 61 3c 35 20 4f 52 44 45 52 20 42 HERE a<5 ORDER B
4020: 59 20 63 0a 20 20 29 20 0a 20 20 53 45 4c 45 43 Y c. ) . SELEC
4030: 54 20 2a 20 46 52 4f 4d 20 74 0a 7d 20 7b 31 20 T * FROM t.} {1
4040: 32 20 33 20 34 20 35 7d 0a 0a 23 20 54 65 73 74 2 3 4 5}..# Test
4050: 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 73 COLLATE clauses
4060: 20 61 74 74 61 63 68 65 64 20 74 6f 20 4f 52 44 attached to ORD
4070: 45 52 20 42 59 2e 0a 23 0a 69 6e 73 65 72 74 5f ER BY..#.insert_
4080: 69 6e 74 6f 5f 74 72 65 65 20 7b 0a 20 20 2f 61 into_tree {. /a
4090: 2f 62 0a 20 20 2f 61 2f 43 0a 20 20 2f 61 2f 64 /b. /a/C. /a/d
40a0: 0a 20 20 2f 42 2f 65 0a 20 20 2f 42 2f 46 0a 20 . /B/e. /B/F.
40b0: 20 2f 42 2f 67 0a 20 20 2f 63 2f 68 0a 20 20 2f /B/g. /c/h. /
40c0: 63 2f 49 0a 20 20 2f 63 2f 6a 0a 7d 0a 0a 64 6f c/I. /c/j.}..do
40d0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 30 _execsql_test 10
40e0: 2e 38 2e 31 20 7b 0a 20 20 57 49 54 48 20 66 6c .8.1 {. WITH fl
40f0: 61 74 28 66 69 64 2c 20 64 65 70 74 68 2c 20 70 at(fid, depth, p
4100: 29 20 41 53 20 28 0a 20 20 20 20 53 45 4c 45 43 ) AS (. SELEC
4110: 54 20 69 64 2c 20 31 2c 20 27 2f 27 20 7c 7c 20 T id, 1, '/' ||
4120: 70 61 79 6c 6f 61 64 20 46 52 4f 4d 20 74 72 65 payload FROM tre
4130: 65 20 57 48 45 52 45 20 70 61 72 65 6e 74 69 64 e WHERE parentid
4140: 20 49 53 20 4e 55 4c 4c 0a 20 20 20 20 55 4e 49 IS NULL. UNI
4150: 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 ON ALL. SELEC
4160: 54 20 69 64 2c 20 64 65 70 74 68 2b 31 2c 20 70 T id, depth+1, p
4170: 7c 7c 27 2f 27 7c 7c 70 61 79 6c 6f 61 64 20 46 ||'/'||payload F
4180: 52 4f 4d 20 66 6c 61 74 2c 20 74 72 65 65 20 57 ROM flat, tree W
4190: 48 45 52 45 20 70 61 72 65 6e 74 69 64 3d 66 69 HERE parentid=fi
41a0: 64 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 32 d. ORDER BY 2
41b0: 2c 20 33 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 , 3 COLLATE noca
41c0: 73 65 0a 20 20 29 0a 20 20 53 45 4c 45 43 54 20 se. ). SELECT
41d0: 70 20 46 52 4f 4d 20 66 6c 61 74 3b 0a 7d 20 7b p FROM flat;.} {
41e0: 0a 20 20 2f 61 20 2f 42 20 2f 63 0a 20 20 2f 61 . /a /B /c. /a
41f0: 2f 62 20 2f 61 2f 43 20 2f 61 2f 64 20 2f 42 2f /b /a/C /a/d /B/
4200: 65 20 2f 42 2f 46 20 2f 42 2f 67 20 2f 63 2f 68 e /B/F /B/g /c/h
4210: 20 2f 63 2f 49 20 2f 63 2f 6a 0a 7d 0a 64 6f 5f /c/I /c/j.}.do_
4220: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 30 2e execsql_test 10.
4230: 38 2e 32 20 7b 0a 20 20 57 49 54 48 20 66 6c 61 8.2 {. WITH fla
4240: 74 28 66 69 64 2c 20 64 65 70 74 68 2c 20 70 29 t(fid, depth, p)
4250: 20 41 53 20 28 0a 20 20 20 20 20 20 53 45 4c 45 AS (. SELE
4260: 43 54 20 69 64 2c 20 31 2c 20 28 27 2f 27 20 7c CT id, 1, ('/' |
4270: 7c 20 70 61 79 6c 6f 61 64 29 20 43 4f 4c 4c 41 | payload) COLLA
4280: 54 45 20 6e 6f 63 61 73 65 20 0a 20 20 20 20 20 TE nocase .
4290: 20 46 52 4f 4d 20 74 72 65 65 20 57 48 45 52 45 FROM tree WHERE
42a0: 20 70 61 72 65 6e 74 69 64 20 49 53 20 4e 55 4c parentid IS NUL
42b0: 4c 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a L. UNION ALL.
42c0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 69 64 2c SELECT id,
42d0: 20 64 65 70 74 68 2b 31 2c 20 28 70 7c 7c 27 2f depth+1, (p||'/
42e0: 27 7c 7c 70 61 79 6c 6f 61 64 29 0a 20 20 20 20 '||payload).
42f0: 20 20 46 52 4f 4d 20 66 6c 61 74 2c 20 74 72 65 FROM flat, tre
4300: 65 20 57 48 45 52 45 20 70 61 72 65 6e 74 69 64 e WHERE parentid
4310: 3d 66 69 64 0a 20 20 20 20 4f 52 44 45 52 20 42 =fid. ORDER B
4320: 59 20 32 2c 20 33 0a 20 20 29 0a 20 20 53 45 4c Y 2, 3. ). SEL
4330: 45 43 54 20 70 20 46 52 4f 4d 20 66 6c 61 74 3b ECT p FROM flat;
4340: 0a 7d 20 7b 0a 20 20 2f 61 20 2f 42 20 2f 63 0a .} {. /a /B /c.
4350: 20 20 2f 61 2f 62 20 2f 61 2f 43 20 2f 61 2f 64 /a/b /a/C /a/d
4360: 20 2f 42 2f 65 20 2f 42 2f 46 20 2f 42 2f 67 20 /B/e /B/F /B/g
4370: 2f 63 2f 68 20 2f 63 2f 49 20 2f 63 2f 6a 0a 7d /c/h /c/I /c/j.}
4380: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 ..do_execsql_tes
4390: 74 20 31 30 2e 38 2e 33 20 7b 0a 20 20 57 49 54 t 10.8.3 {. WIT
43a0: 48 20 66 6c 61 74 28 66 69 64 2c 20 64 65 70 74 H flat(fid, dept
43b0: 68 2c 20 70 29 20 41 53 20 28 0a 20 20 20 20 20 h, p) AS (.
43c0: 20 53 45 4c 45 43 54 20 69 64 2c 20 31 2c 20 28 SELECT id, 1, (
43d0: 27 2f 27 20 7c 7c 20 70 61 79 6c 6f 61 64 29 0a '/' || payload).
43e0: 20 20 20 20 20 20 46 52 4f 4d 20 74 72 65 65 20 FROM tree
43f0: 57 48 45 52 45 20 70 61 72 65 6e 74 69 64 20 49 WHERE parentid I
4400: 53 20 4e 55 4c 4c 0a 20 20 20 20 55 4e 49 4f 4e S NULL. UNION
4410: 20 41 4c 4c 0a 20 20 20 20 20 20 53 45 4c 45 43 ALL. SELEC
4420: 54 20 69 64 2c 20 64 65 70 74 68 2b 31 2c 20 28 T id, depth+1, (
4430: 70 7c 7c 27 2f 27 7c 7c 70 61 79 6c 6f 61 64 29 p||'/'||payload)
4440: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 COLLATE nocase
4450: 0a 20 20 20 20 20 20 46 52 4f 4d 20 66 6c 61 74 . FROM flat
4460: 2c 20 74 72 65 65 20 57 48 45 52 45 20 70 61 72 , tree WHERE par
4470: 65 6e 74 69 64 3d 66 69 64 0a 20 20 20 20 4f 52 entid=fid. OR
4480: 44 45 52 20 42 59 20 32 2c 20 33 0a 20 20 29 0a DER BY 2, 3. ).
4490: 20 20 53 45 4c 45 43 54 20 70 20 46 52 4f 4d 20 SELECT p FROM
44a0: 66 6c 61 74 3b 0a 7d 20 7b 0a 20 20 2f 61 20 2f flat;.} {. /a /
44b0: 42 20 2f 63 0a 20 20 2f 61 2f 62 20 2f 61 2f 43 B /c. /a/b /a/C
44c0: 20 2f 61 2f 64 20 2f 42 2f 65 20 2f 42 2f 46 20 /a/d /B/e /B/F
44d0: 2f 42 2f 67 20 2f 63 2f 68 20 2f 63 2f 49 20 2f /B/g /c/h /c/I /
44e0: 63 2f 6a 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 c/j.}..do_execsq
44f0: 6c 5f 74 65 73 74 20 31 30 2e 38 2e 34 2e 31 20 l_test 10.8.4.1
4500: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 {. CREATE TABLE
4510: 20 74 73 74 28 61 2c 62 29 3b 0a 20 20 49 4e 53 tst(a,b);. INS
4520: 45 52 54 20 49 4e 54 4f 20 74 73 74 20 56 41 4c ERT INTO tst VAL
4530: 55 45 53 28 27 61 27 2c 20 27 41 27 29 3b 0a 20 UES('a', 'A');.
4540: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 73 74 INSERT INTO tst
4550: 20 56 41 4c 55 45 53 28 27 62 27 2c 20 27 42 27 VALUES('b', 'B'
4560: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f );. INSERT INTO
4570: 20 74 73 74 20 56 41 4c 55 45 53 28 27 63 27 2c tst VALUES('c',
4580: 20 27 43 27 29 3b 0a 20 20 53 45 4c 45 43 54 20 'C');. SELECT
4590: 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 a COLLATE nocase
45a0: 20 46 52 4f 4d 20 74 73 74 20 55 4e 49 4f 4e 20 FROM tst UNION
45b0: 41 4c 4c 20 53 45 4c 45 43 54 20 62 20 46 52 4f ALL SELECT b FRO
45c0: 4d 20 74 73 74 20 4f 52 44 45 52 20 42 59 20 31 M tst ORDER BY 1
45d0: 3b 0a 7d 20 7b 61 20 41 20 62 20 42 20 63 20 43 ;.} {a A b B c C
45e0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 }.do_execsql_tes
45f0: 74 20 31 30 2e 38 2e 34 2e 32 20 7b 0a 20 20 53 t 10.8.4.2 {. S
4600: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 73 74 ELECT a FROM tst
4610: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 UNION ALL SELEC
4620: 54 20 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 T b COLLATE noca
4630: 73 65 20 46 52 4f 4d 20 74 73 74 20 4f 52 44 45 se FROM tst ORDE
4640: 52 20 42 59 20 31 3b 0a 7d 20 7b 41 20 42 20 43 R BY 1;.} {A B C
4650: 20 61 20 62 20 63 7d 0a 64 6f 5f 65 78 65 63 73 a b c}.do_execs
4660: 71 6c 5f 74 65 73 74 20 31 30 2e 38 2e 34 2e 33 ql_test 10.8.4.3
4670: 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 7c 7c 27 {. SELECT a||'
4680: 27 20 46 52 4f 4d 20 74 73 74 20 55 4e 49 4f 4e ' FROM tst UNION
4690: 20 41 4c 4c 20 53 45 4c 45 43 54 20 62 20 43 4f ALL SELECT b CO
46a0: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 46 52 4f LLATE nocase FRO
46b0: 4d 20 74 73 74 20 4f 52 44 45 52 20 42 59 20 31 M tst ORDER BY 1
46c0: 3b 0a 7d 20 7b 61 20 41 20 62 20 42 20 63 20 43 ;.} {a A b B c C
46d0: 7d 0a 0a 23 20 54 65 73 74 20 63 61 73 65 73 20 }..# Test cases
46e0: 74 6f 20 69 6c 6c 75 73 74 72 61 74 65 20 6f 6e to illustrate on
46f0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c the ORDER BY cl
4700: 61 75 73 65 20 6f 6e 20 61 20 72 65 63 75 72 73 ause on a recurs
4710: 69 76 65 20 71 75 65 72 79 20 63 61 6e 20 62 65 ive query can be
4720: 0a 23 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 .# used to contr
4730: 6f 6c 20 64 65 70 74 68 2d 66 69 72 73 74 20 76 ol depth-first v
4740: 65 72 73 75 73 20 62 72 65 61 74 68 2d 66 69 72 ersus breath-fir
4750: 73 74 20 73 65 61 72 63 68 20 69 6e 20 61 20 74 st search in a t
4760: 72 65 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 ree..#.do_execsq
4770: 6c 5f 74 65 73 74 20 31 31 2e 31 20 7b 0a 20 20 l_test 11.1 {.
4780: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 67 CREATE TABLE org
4790: 28 0a 20 20 20 20 6e 61 6d 65 20 54 45 58 54 20 (. name TEXT
47a0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 PRIMARY KEY,.
47b0: 20 62 6f 73 73 20 54 45 58 54 20 52 45 46 45 52 boss TEXT REFER
47c0: 45 4e 43 45 53 20 6f 72 67 0a 20 20 29 20 57 49 ENCES org. ) WI
47d0: 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 20 20 49 THOUT ROWID;. I
47e0: 4e 53 45 52 54 20 49 4e 54 4f 20 6f 72 67 20 56 NSERT INTO org V
47f0: 41 4c 55 45 53 28 27 41 6c 69 63 65 27 2c 4e 55 ALUES('Alice',NU
4800: 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e LL);. INSERT IN
4810: 54 4f 20 6f 72 67 20 56 41 4c 55 45 53 28 27 42 TO org VALUES('B
4820: 6f 62 27 2c 27 41 6c 69 63 65 27 29 3b 0a 20 20 ob','Alice');.
4830: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 72 67 20 INSERT INTO org
4840: 56 41 4c 55 45 53 28 27 43 69 6e 64 79 27 2c 27 VALUES('Cindy','
4850: 41 6c 69 63 65 27 29 3b 0a 20 20 49 4e 53 45 52 Alice');. INSER
4860: 54 20 49 4e 54 4f 20 6f 72 67 20 56 41 4c 55 45 T INTO org VALUE
4870: 53 28 27 44 61 76 65 27 2c 27 42 6f 62 27 29 3b S('Dave','Bob');
4880: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f . INSERT INTO o
4890: 72 67 20 56 41 4c 55 45 53 28 27 45 6d 6d 61 27 rg VALUES('Emma'
48a0: 2c 27 42 6f 62 27 29 3b 0a 20 20 49 4e 53 45 52 ,'Bob');. INSER
48b0: 54 20 49 4e 54 4f 20 6f 72 67 20 56 41 4c 55 45 T INTO org VALUE
48c0: 53 28 27 46 72 65 64 27 2c 27 43 69 6e 64 79 27 S('Fred','Cindy'
48d0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f );. INSERT INTO
48e0: 20 6f 72 67 20 56 41 4c 55 45 53 28 27 47 61 69 org VALUES('Gai
48f0: 6c 27 2c 27 43 69 6e 64 79 27 29 3b 0a 20 20 49 l','Cindy');. I
4900: 4e 53 45 52 54 20 49 4e 54 4f 20 6f 72 67 20 56 NSERT INTO org V
4910: 41 4c 55 45 53 28 27 48 61 72 72 79 27 2c 27 44 ALUES('Harry','D
4920: 61 76 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 ave');. INSERT
4930: 49 4e 54 4f 20 6f 72 67 20 56 41 4c 55 45 53 28 INTO org VALUES(
4940: 27 49 6e 67 72 69 64 27 2c 27 44 61 76 65 27 29 'Ingrid','Dave')
4950: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 ;. INSERT INTO
4960: 6f 72 67 20 56 41 4c 55 45 53 28 27 4a 69 6d 27 org VALUES('Jim'
4970: 2c 27 45 6d 6d 61 27 29 3b 0a 20 20 49 4e 53 45 ,'Emma');. INSE
4980: 52 54 20 49 4e 54 4f 20 6f 72 67 20 56 41 4c 55 RT INTO org VALU
4990: 45 53 28 27 4b 61 74 65 27 2c 27 45 6d 6d 61 27 ES('Kate','Emma'
49a0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f );. INSERT INTO
49b0: 20 6f 72 67 20 56 41 4c 55 45 53 28 27 4c 61 6e org VALUES('Lan
49c0: 6e 79 27 2c 27 46 72 65 64 27 29 3b 0a 20 20 49 ny','Fred');. I
49d0: 4e 53 45 52 54 20 49 4e 54 4f 20 6f 72 67 20 56 NSERT INTO org V
49e0: 41 4c 55 45 53 28 27 4d 61 72 79 27 2c 27 46 72 ALUES('Mary','Fr
49f0: 65 64 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 ed');. INSERT I
4a00: 4e 54 4f 20 6f 72 67 20 56 41 4c 55 45 53 28 27 NTO org VALUES('
4a10: 4e 6f 6c 61 6e 64 27 2c 27 47 61 69 6c 27 29 3b Noland','Gail');
4a20: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f . INSERT INTO o
4a30: 72 67 20 56 41 4c 55 45 53 28 27 4f 6c 69 76 69 rg VALUES('Olivi
4a40: 61 27 2c 27 47 61 69 6c 27 29 3b 0a 20 20 2d 2d a','Gail');. --
4a50: 20 54 68 65 20 61 62 6f 76 65 20 61 72 65 20 61 The above are a
4a60: 6c 6c 20 75 6e 64 65 72 20 41 6c 69 63 65 2e 20 ll under Alice.
4a70: 20 41 64 64 20 61 20 66 65 77 20 6d 6f 72 65 20 Add a few more
4a80: 72 65 63 6f 72 64 73 20 66 6f 72 20 70 65 6f 70 records for peop
4a90: 6c 65 0a 20 20 2d 2d 20 6e 6f 74 20 69 6e 20 41 le. -- not in A
4aa0: 6c 69 63 65 27 73 20 67 72 6f 75 70 2c 20 6a 75 lice's group, ju
4ab0: 73 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74 st to prove that
4ac0: 20 74 68 65 79 20 77 6f 6e 27 74 20 62 65 20 73 they won't be s
4ad0: 65 6c 65 63 74 65 64 2e 0a 20 20 49 4e 53 45 52 elected.. INSER
4ae0: 54 20 49 4e 54 4f 20 6f 72 67 20 56 41 4c 55 45 T INTO org VALUE
4af0: 53 28 27 58 61 76 69 61 72 27 2c 4e 55 4c 4c 29 S('Xaviar',NULL)
4b00: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 ;. INSERT INTO
4b10: 6f 72 67 20 56 41 4c 55 45 53 28 27 58 69 61 27 org VALUES('Xia'
4b20: 2c 27 58 61 76 69 61 72 27 29 3b 0a 20 20 49 4e ,'Xaviar');. IN
4b30: 53 45 52 54 20 49 4e 54 4f 20 6f 72 67 20 56 41 SERT INTO org VA
4b40: 4c 55 45 53 28 27 58 65 72 78 65 73 27 2c 27 58 LUES('Xerxes','X
4b50: 61 76 69 61 72 27 29 3b 0a 20 20 49 4e 53 45 52 aviar');. INSER
4b60: 54 20 49 4e 54 4f 20 6f 72 67 20 56 41 4c 55 45 T INTO org VALUE
4b70: 53 28 27 58 65 6e 61 27 2c 27 58 69 61 27 29 3b S('Xena','Xia');
4b80: 0a 20 20 2d 2d 20 46 69 6e 64 20 61 6c 6c 20 6d . -- Find all m
4b90: 65 6d 62 65 72 73 20 6f 66 20 41 6c 69 63 65 27 embers of Alice'
4ba0: 73 20 67 72 6f 75 70 2c 20 62 72 65 61 74 68 2d s group, breath-
4bb0: 66 69 72 73 74 20 6f 72 64 65 72 20 20 0a 20 20 first order .
4bc0: 57 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 20 WITH RECURSIVE.
4bd0: 20 20 20 75 6e 64 65 72 5f 61 6c 69 63 65 28 6e under_alice(n
4be0: 61 6d 65 2c 6c 65 76 65 6c 29 20 41 53 20 28 0a ame,level) AS (.
4bf0: 20 20 20 20 20 20 20 56 41 4c 55 45 53 28 27 41 VALUES('A
4c00: 6c 69 63 65 27 2c 27 30 27 29 0a 20 20 20 20 20 lice','0').
4c10: 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 UNION ALL.
4c20: 20 20 20 53 45 4c 45 43 54 20 6f 72 67 2e 6e 61 SELECT org.na
4c30: 6d 65 2c 20 75 6e 64 65 72 5f 61 6c 69 63 65 2e me, under_alice.
4c40: 6c 65 76 65 6c 2b 31 0a 20 20 20 20 20 20 20 20 level+1.
4c50: 20 46 52 4f 4d 20 6f 72 67 2c 20 75 6e 64 65 72 FROM org, under
4c60: 5f 61 6c 69 63 65 0a 20 20 20 20 20 20 20 20 57 _alice. W
4c70: 48 45 52 45 20 6f 72 67 2e 62 6f 73 73 3d 75 6e HERE org.boss=un
4c80: 64 65 72 5f 61 6c 69 63 65 2e 6e 61 6d 65 0a 20 der_alice.name.
4c90: 20 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 ORDER BY
4ca0: 32 0a 20 20 20 20 29 0a 20 20 53 45 4c 45 43 54 2. ). SELECT
4cb0: 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 73 75 group_concat(su
4cc0: 62 73 74 72 28 27 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e bstr('..........
4cd0: 2e 2e 2e 2e 2e 27 2c 31 2c 6c 65 76 65 6c 2a 33 .....',1,level*3
4ce0: 29 20 7c 7c 20 6e 61 6d 65 2c 78 27 30 61 27 29 ) || name,x'0a')
4cf0: 0a 20 20 20 20 46 52 4f 4d 20 75 6e 64 65 72 5f . FROM under_
4d00: 61 6c 69 63 65 3b 0a 7d 20 7b 7b 41 6c 69 63 65 alice;.} {{Alice
4d10: 0a 2e 2e 2e 42 6f 62 0a 2e 2e 2e 43 69 6e 64 79 ....Bob....Cindy
4d20: 0a 2e 2e 2e 2e 2e 2e 44 61 76 65 0a 2e 2e 2e 2e .......Dave.....
4d30: 2e 2e 45 6d 6d 61 0a 2e 2e 2e 2e 2e 2e 46 72 65 ..Emma.......Fre
4d40: 64 0a 2e 2e 2e 2e 2e 2e 47 61 69 6c 0a 2e 2e 2e d.......Gail....
4d50: 2e 2e 2e 2e 2e 2e 48 61 72 72 79 0a 2e 2e 2e 2e ......Harry.....
4d60: 2e 2e 2e 2e 2e 49 6e 67 72 69 64 0a 2e 2e 2e 2e .....Ingrid.....
4d70: 2e 2e 2e 2e 2e 4a 69 6d 0a 2e 2e 2e 2e 2e 2e 2e .....Jim........
4d80: 2e 2e 4b 61 74 65 0a 2e 2e 2e 2e 2e 2e 2e 2e 2e ..Kate..........
4d90: 4c 61 6e 6e 79 0a 2e 2e 2e 2e 2e 2e 2e 2e 2e 4d Lanny..........M
4da0: 61 72 79 0a 2e 2e 2e 2e 2e 2e 2e 2e 2e 4e 6f 6c ary..........Nol
4db0: 61 6e 64 0a 2e 2e 2e 2e 2e 2e 2e 2e 2e 4f 6c 69 and..........Oli
4dc0: 76 69 61 7d 7d 0a 0a 23 20 54 68 65 20 70 72 65 via}}..# The pre
4dd0: 76 69 6f 75 73 20 71 75 65 72 79 20 75 73 65 64 vious query used
4de0: 20 22 4f 52 44 45 52 20 42 59 20 6c 65 76 65 6c "ORDER BY level
4df0: 22 20 74 6f 20 79 69 65 6c 64 20 61 20 62 72 65 " to yield a bre
4e00: 61 74 68 2d 66 69 72 73 74 20 73 65 61 72 63 68 ath-first search
4e10: 2e 0a 23 20 43 68 61 6e 67 65 20 74 68 61 74 20 ..# Change that
4e20: 74 6f 20 22 4f 52 44 45 52 20 42 59 20 6c 65 76 to "ORDER BY lev
4e30: 65 6c 20 44 45 53 43 22 20 66 6f 72 20 61 20 64 el DESC" for a d
4e40: 65 70 74 68 2d 66 69 72 73 74 20 73 65 61 72 63 epth-first searc
4e50: 68 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f h..#.do_execsql_
4e60: 74 65 73 74 20 31 31 2e 32 20 7b 0a 20 20 57 49 test 11.2 {. WI
4e70: 54 48 20 52 45 43 55 52 53 49 56 45 0a 20 20 20 TH RECURSIVE.
4e80: 20 75 6e 64 65 72 5f 61 6c 69 63 65 28 6e 61 6d under_alice(nam
4e90: 65 2c 6c 65 76 65 6c 29 20 41 53 20 28 0a 20 20 e,level) AS (.
4ea0: 20 20 20 20 20 56 41 4c 55 45 53 28 27 41 6c 69 VALUES('Ali
4eb0: 63 65 27 2c 27 30 27 29 0a 20 20 20 20 20 20 20 ce','0').
4ec0: 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 UNION ALL.
4ed0: 20 53 45 4c 45 43 54 20 6f 72 67 2e 6e 61 6d 65 SELECT org.name
4ee0: 2c 20 75 6e 64 65 72 5f 61 6c 69 63 65 2e 6c 65 , under_alice.le
4ef0: 76 65 6c 2b 31 0a 20 20 20 20 20 20 20 20 20 46 vel+1. F
4f00: 52 4f 4d 20 6f 72 67 2c 20 75 6e 64 65 72 5f 61 ROM org, under_a
4f10: 6c 69 63 65 0a 20 20 20 20 20 20 20 20 57 48 45 lice. WHE
4f20: 52 45 20 6f 72 67 2e 62 6f 73 73 3d 75 6e 64 65 RE org.boss=unde
4f30: 72 5f 61 6c 69 63 65 2e 6e 61 6d 65 0a 20 20 20 r_alice.name.
4f40: 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 32 20 ORDER BY 2
4f50: 44 45 53 43 0a 20 20 20 20 29 0a 20 20 53 45 4c DESC. ). SEL
4f60: 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 ECT group_concat
4f70: 28 73 75 62 73 74 72 28 27 2e 2e 2e 2e 2e 2e 2e (substr('.......
4f80: 2e 2e 2e 2e 2e 2e 2e 2e 27 2c 31 2c 6c 65 76 65 ........',1,leve
4f90: 6c 2a 33 29 20 7c 7c 20 6e 61 6d 65 2c 78 27 30 l*3) || name,x'0
4fa0: 61 27 29 0a 20 20 20 20 46 52 4f 4d 20 75 6e 64 a'). FROM und
4fb0: 65 72 5f 61 6c 69 63 65 3b 0a 7d 20 7b 7b 41 6c er_alice;.} {{Al
4fc0: 69 63 65 0a 2e 2e 2e 42 6f 62 0a 2e 2e 2e 2e 2e ice....Bob......
4fd0: 2e 44 61 76 65 0a 2e 2e 2e 2e 2e 2e 2e 2e 2e 48 .Dave..........H
4fe0: 61 72 72 79 0a 2e 2e 2e 2e 2e 2e 2e 2e 2e 49 6e arry..........In
4ff0: 67 72 69 64 0a 2e 2e 2e 2e 2e 2e 45 6d 6d 61 0a grid.......Emma.
5000: 2e 2e 2e 2e 2e 2e 2e 2e 2e 4a 69 6d 0a 2e 2e 2e .........Jim....
5010: 2e 2e 2e 2e 2e 2e 4b 61 74 65 0a 2e 2e 2e 43 69 ......Kate....Ci
5020: 6e 64 79 0a 2e 2e 2e 2e 2e 2e 46 72 65 64 0a 2e ndy.......Fred..
5030: 2e 2e 2e 2e 2e 2e 2e 2e 4c 61 6e 6e 79 0a 2e 2e ........Lanny...
5040: 2e 2e 2e 2e 2e 2e 2e 4d 61 72 79 0a 2e 2e 2e 2e .......Mary.....
5050: 2e 2e 47 61 69 6c 0a 2e 2e 2e 2e 2e 2e 2e 2e 2e ..Gail..........
5060: 4e 6f 6c 61 6e 64 0a 2e 2e 2e 2e 2e 2e 2e 2e 2e Noland..........
5070: 4f 6c 69 76 69 61 7d 7d 0a 0a 23 20 57 69 74 68 Olivia}}..# With
5080: 6f 75 74 20 61 6e 20 4f 52 44 45 52 20 42 59 20 out an ORDER BY
5090: 63 6c 61 75 73 65 2c 20 74 68 65 20 72 65 63 75 clause, the recu
50a0: 72 73 69 76 65 20 71 75 65 72 79 20 73 68 6f 75 rsive query shou
50b0: 6c 64 20 75 73 65 20 61 20 46 49 46 4f 2c 0a 23 ld use a FIFO,.#
50c0: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 resulting in a
50d0: 62 72 65 61 74 68 2d 66 69 72 73 74 20 73 65 61 breath-first sea
50e0: 72 63 68 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 rch..#.do_execsq
50f0: 6c 5f 74 65 73 74 20 31 31 2e 33 20 7b 0a 20 20 l_test 11.3 {.
5100: 57 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 20 WITH RECURSIVE.
5110: 20 20 20 75 6e 64 65 72 5f 61 6c 69 63 65 28 6e under_alice(n
5120: 61 6d 65 2c 6c 65 76 65 6c 29 20 41 53 20 28 0a ame,level) AS (.
5130: 20 20 20 20 20 20 20 56 41 4c 55 45 53 28 27 41 VALUES('A
5140: 6c 69 63 65 27 2c 27 30 27 29 0a 20 20 20 20 20 lice','0').
5150: 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 UNION ALL.
5160: 20 20 20 53 45 4c 45 43 54 20 6f 72 67 2e 6e 61 SELECT org.na
5170: 6d 65 2c 20 75 6e 64 65 72 5f 61 6c 69 63 65 2e me, under_alice.
5180: 6c 65 76 65 6c 2b 31 0a 20 20 20 20 20 20 20 20 level+1.
5190: 20 46 52 4f 4d 20 6f 72 67 2c 20 75 6e 64 65 72 FROM org, under
51a0: 5f 61 6c 69 63 65 0a 20 20 20 20 20 20 20 20 57 _alice. W
51b0: 48 45 52 45 20 6f 72 67 2e 62 6f 73 73 3d 75 6e HERE org.boss=un
51c0: 64 65 72 5f 61 6c 69 63 65 2e 6e 61 6d 65 0a 20 der_alice.name.
51d0: 20 20 20 29 0a 20 20 53 45 4c 45 43 54 20 67 72 ). SELECT gr
51e0: 6f 75 70 5f 63 6f 6e 63 61 74 28 73 75 62 73 74 oup_concat(subst
51f0: 72 28 27 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e r('.............
5200: 2e 2e 27 2c 31 2c 6c 65 76 65 6c 2a 33 29 20 7c ..',1,level*3) |
5210: 7c 20 6e 61 6d 65 2c 78 27 30 61 27 29 0a 20 20 | name,x'0a').
5220: 20 20 46 52 4f 4d 20 75 6e 64 65 72 5f 61 6c 69 FROM under_ali
5230: 63 65 3b 0a 7d 20 7b 7b 41 6c 69 63 65 0a 2e 2e ce;.} {{Alice...
5240: 2e 42 6f 62 0a 2e 2e 2e 43 69 6e 64 79 0a 2e 2e .Bob....Cindy...
5250: 2e 2e 2e 2e 44 61 76 65 0a 2e 2e 2e 2e 2e 2e 45 ....Dave.......E
5260: 6d 6d 61 0a 2e 2e 2e 2e 2e 2e 46 72 65 64 0a 2e mma.......Fred..
5270: 2e 2e 2e 2e 2e 47 61 69 6c 0a 2e 2e 2e 2e 2e 2e .....Gail.......
5280: 2e 2e 2e 48 61 72 72 79 0a 2e 2e 2e 2e 2e 2e 2e ...Harry........
5290: 2e 2e 49 6e 67 72 69 64 0a 2e 2e 2e 2e 2e 2e 2e ..Ingrid........
52a0: 2e 2e 4a 69 6d 0a 2e 2e 2e 2e 2e 2e 2e 2e 2e 4b ..Jim..........K
52b0: 61 74 65 0a 2e 2e 2e 2e 2e 2e 2e 2e 2e 4c 61 6e ate..........Lan
52c0: 6e 79 0a 2e 2e 2e 2e 2e 2e 2e 2e 2e 4d 61 72 79 ny..........Mary
52d0: 0a 2e 2e 2e 2e 2e 2e 2e 2e 2e 4e 6f 6c 61 6e 64 ..........Noland
52e0: 0a 2e 2e 2e 2e 2e 2e 2e 2e 2e 4f 6c 69 76 69 61 ..........Olivia
52f0: 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d }}..#-----------
5300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
5340: 23 20 54 69 63 6b 65 74 20 5b 33 31 61 31 39 64 # Ticket [31a19d
5350: 31 31 62 39 37 30 38 38 32 39 36 61 63 31 30 34 11b97088296ac104
5360: 61 61 66 66 31 31 33 61 39 37 39 30 33 39 34 39 aaff113a97903949
5370: 32 37 5d 20 28 32 30 31 34 2d 30 32 2d 30 39 29 27] (2014-02-09)
5380: 0a 23 20 4e 61 6d 65 20 72 65 73 6f 6c 75 74 69 .# Name resoluti
5390: 6f 6e 20 69 73 73 75 65 20 77 69 74 68 20 63 6f on issue with co
53a0: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 61 mpound SELECTs a
53b0: 6e 64 20 43 6f 6d 6d 6f 6e 20 54 61 62 6c 65 20 nd Common Table
53c0: 45 78 70 72 65 73 73 69 6f 6e 73 20 0a 23 0a 64 Expressions .#.d
53d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 o_execsql_test 1
53e0: 32 2e 31 20 7b 0a 57 49 54 48 20 52 45 43 55 52 2.1 {.WITH RECUR
53f0: 53 49 56 45 0a 20 20 74 31 28 78 29 20 41 53 20 SIVE. t1(x) AS
5400: 28 56 41 4c 55 45 53 28 32 29 20 55 4e 49 4f 4e (VALUES(2) UNION
5410: 20 41 4c 4c 20 53 45 4c 45 43 54 20 78 2b 32 20 ALL SELECT x+2
5420: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 3c FROM t1 WHERE x<
5430: 32 30 29 2c 0a 20 20 74 32 28 79 29 20 41 53 20 20),. t2(y) AS
5440: 28 56 41 4c 55 45 53 28 33 29 20 55 4e 49 4f 4e (VALUES(3) UNION
5450: 20 41 4c 4c 20 53 45 4c 45 43 54 20 79 2b 33 20 ALL SELECT y+3
5460: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 79 3c FROM t2 WHERE y<
5470: 32 30 29 0a 53 45 4c 45 43 54 20 78 20 46 52 4f 20).SELECT x FRO
5480: 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 M t1 EXCEPT SELE
5490: 43 54 20 79 20 46 52 4f 4d 20 74 32 20 4f 52 44 CT y FROM t2 ORD
54a0: 45 52 20 42 59 20 31 3b 0a 7d 20 7b 32 20 34 20 ER BY 1;.} {2 4
54b0: 38 20 31 30 20 31 34 20 31 36 20 32 30 7d 0a 0a 8 10 14 16 20}..
54c0: 23 20 32 30 31 35 2d 30 33 2d 32 31 0a 23 20 43 # 2015-03-21.# C
54d0: 6f 6c 75 6d 6e 20 77 69 6c 64 63 61 72 64 73 20 olumn wildcards
54e0: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 61 20 on the LHS of a
54f0: 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 recursive table
5500: 65 78 70 72 65 73 73 69 6f 6e 0a 23 0a 64 6f 5f expression.#.do_
5510: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 31 33 catchsql_test 13
5520: 2e 31 20 7b 0a 20 20 57 49 54 48 20 52 45 43 55 .1 {. WITH RECU
5530: 52 53 49 56 45 20 63 28 69 29 20 41 53 20 28 53 RSIVE c(i) AS (S
5540: 45 4c 45 43 54 20 2a 20 55 4e 49 4f 4e 20 41 4c ELECT * UNION AL
5550: 4c 20 53 45 4c 45 43 54 20 69 2b 31 20 46 52 4f L SELECT i+1 FRO
5560: 4d 20 63 20 57 48 45 52 45 20 69 3c 31 30 29 0a M c WHERE i<10).
5570: 20 20 53 45 4c 45 43 54 20 69 20 46 52 4f 4d 20 SELECT i FROM
5580: 63 3b 0a 7d 20 7b 31 20 7b 6e 6f 20 74 61 62 6c c;.} {1 {no tabl
5590: 65 73 20 73 70 65 63 69 66 69 65 64 7d 7d 0a 64 es specified}}.d
55a0: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 o_catchsql_test
55b0: 31 33 2e 32 20 7b 0a 20 20 57 49 54 48 20 52 45 13.2 {. WITH RE
55c0: 43 55 52 53 49 56 45 20 63 28 69 29 20 41 53 20 CURSIVE c(i) AS
55d0: 28 53 45 4c 45 43 54 20 35 2c 2a 20 55 4e 49 4f (SELECT 5,* UNIO
55e0: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 69 2b 31 N ALL SELECT i+1
55f0: 20 46 52 4f 4d 20 63 20 57 48 45 52 45 20 69 3c FROM c WHERE i<
5600: 31 30 29 0a 20 20 53 45 4c 45 43 54 20 69 20 46 10). SELECT i F
5610: 52 4f 4d 20 63 3b 0a 7d 20 7b 31 20 7b 6e 6f 20 ROM c;.} {1 {no
5620: 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 tables specified
5630: 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 }}.do_catchsql_t
5640: 65 73 74 20 31 33 2e 33 20 7b 0a 20 20 57 49 54 est 13.3 {. WIT
5650: 48 20 52 45 43 55 52 53 49 56 45 20 63 28 69 2c H RECURSIVE c(i,
5660: 6a 29 20 41 53 20 28 53 45 4c 45 43 54 20 35 2c j) AS (SELECT 5,
5670: 2a 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 * UNION ALL SELE
5680: 43 54 20 69 2b 31 2c 31 31 20 46 52 4f 4d 20 63 CT i+1,11 FROM c
5690: 20 57 48 45 52 45 20 69 3c 31 30 29 0a 20 20 53 WHERE i<10). S
56a0: 45 4c 45 43 54 20 69 20 46 52 4f 4d 20 63 3b 0a ELECT i FROM c;.
56b0: 7d 20 7b 31 20 7b 74 61 62 6c 65 20 63 20 68 61 } {1 {table c ha
56c0: 73 20 31 20 76 61 6c 75 65 73 20 66 6f 72 20 32 s 1 values for 2
56d0: 20 63 6f 6c 75 6d 6e 73 7d 7d 0a 0a 23 20 32 30 columns}}..# 20
56e0: 31 35 2d 30 34 2d 31 32 0a 23 0a 64 6f 5f 65 78 15-04-12.#.do_ex
56f0: 65 63 73 71 6c 5f 74 65 73 74 20 31 34 2e 31 20 ecsql_test 14.1
5700: 7b 0a 20 20 57 49 54 48 20 78 20 41 53 20 28 53 {. WITH x AS (S
5710: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 29 20 ELECT * FROM t)
5720: 53 45 4c 45 43 54 20 30 20 45 58 43 45 50 54 20 SELECT 0 EXCEPT
5730: 53 45 4c 45 43 54 20 30 20 4f 52 44 45 52 20 42 SELECT 0 ORDER B
5740: 59 20 31 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 Y 1 COLLATE bina
5750: 72 79 3b 0a 7d 20 7b 7d 0a 0a 23 20 32 30 31 35 ry;.} {}..# 2015
5760: 2d 30 35 2d 32 37 3a 20 20 44 6f 20 6e 6f 74 20 -05-27: Do not
5770: 61 6c 6c 6f 77 20 72 6f 77 69 64 20 75 73 61 67 allow rowid usag
5780: 65 20 77 69 74 68 69 6e 20 61 20 43 54 45 0a 23 e within a CTE.#
5790: 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 .do_catchsql_tes
57a0: 74 20 31 35 2e 31 20 7b 0a 20 20 57 49 54 48 20 t 15.1 {. WITH
57b0: 52 45 43 55 52 53 49 56 45 0a 20 20 20 20 64 28 RECURSIVE. d(
57c0: 78 29 20 41 53 20 28 56 41 4c 55 45 53 28 31 29 x) AS (VALUES(1)
57d0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 UNION ALL SELEC
57e0: 54 20 72 6f 77 69 64 2b 31 20 46 52 4f 4d 20 64 T rowid+1 FROM d
57f0: 20 57 48 45 52 45 20 72 6f 77 69 64 3c 31 30 29 WHERE rowid<10)
5800: 0a 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d . SELECT x FROM
5810: 20 64 3b 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 d;.} {1 {no suc
5820: 68 20 63 6f 6c 75 6d 6e 3a 20 72 6f 77 69 64 7d h column: rowid}
5830: 7d 0a 0a 23 20 32 30 31 35 2d 30 37 2d 30 35 3a }..# 2015-07-05:
5840: 20 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 Do not allow a
5850: 67 67 72 65 67 61 74 65 20 72 65 63 75 72 73 69 ggregate recursi
5860: 76 65 20 71 75 65 72 69 65 73 0a 23 0a 64 6f 5f ve queries.#.do_
5870: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 31 36 catchsql_test 16
5880: 2e 31 20 7b 0a 20 20 57 49 54 48 20 52 45 43 55 .1 {. WITH RECU
5890: 52 53 49 56 45 0a 20 20 20 20 69 28 78 29 20 41 RSIVE. i(x) A
58a0: 53 20 28 56 41 4c 55 45 53 28 31 29 20 55 4e 49 S (VALUES(1) UNI
58b0: 4f 4e 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 ON SELECT count(
58c0: 2a 29 20 46 52 4f 4d 20 69 29 0a 20 20 53 45 4c *) FROM i). SEL
58d0: 45 43 54 20 2a 20 46 52 4f 4d 20 69 3b 0a 7d 20 ECT * FROM i;.}
58e0: 7b 31 20 7b 72 65 63 75 72 73 69 76 65 20 61 67 {1 {recursive ag
58f0: 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 gregate queries
5900: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 7d 7d 0a not supported}}.
5910: 0a 23 20 4f 72 20 77 69 6e 64 6f 77 2d 66 75 6e .# Or window-fun
5920: 63 74 69 6f 6e 20 72 65 63 75 72 73 69 76 65 20 ction recursive
5930: 71 75 65 72 69 65 73 2e 20 54 69 63 6b 65 74 20 queries. Ticket
5940: 65 38 32 37 35 62 34 31 2e 0a 23 0a 69 66 63 61 e8275b41..#.ifca
5950: 70 61 62 6c 65 20 77 69 6e 64 6f 77 66 75 6e 63 pable windowfunc
5960: 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c {. do_catchsql
5970: 5f 74 65 73 74 20 31 36 2e 32 20 7b 0a 20 20 20 _test 16.2 {.
5980: 20 57 49 54 48 20 52 45 43 55 52 53 49 56 45 0a WITH RECURSIVE.
5990: 20 20 20 20 20 20 69 28 78 29 20 41 53 20 28 56 i(x) AS (V
59a0: 41 4c 55 45 53 28 31 29 20 55 4e 49 4f 4e 20 53 ALUES(1) UNION S
59b0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 4f ELECT count(*) O
59c0: 56 45 52 20 28 29 20 46 52 4f 4d 20 69 29 0a 20 VER () FROM i).
59d0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 SELECT * FR
59e0: 4f 4d 20 69 3b 0a 20 20 7d 20 7b 31 20 7b 63 61 OM i;. } {1 {ca
59f0: 6e 6e 6f 74 20 75 73 65 20 77 69 6e 64 6f 77 20 nnot use window
5a00: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 72 65 63 functions in rec
5a10: 75 72 73 69 76 65 20 71 75 65 72 69 65 73 7d 7d ursive queries}}
5a20: 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 . do_catchsql_t
5a30: 65 73 74 20 31 36 2e 33 20 7b 0a 20 20 20 20 57 est 16.3 {. W
5a40: 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 20 20 ITH RECURSIVE.
5a50: 20 20 20 20 74 28 69 64 2c 20 70 61 72 65 6e 74 t(id, parent
5a60: 29 20 41 53 20 28 56 41 4c 55 45 53 28 31 2c 32 ) AS (VALUES(1,2
5a70: 29 29 2c 0a 20 20 20 20 20 20 71 28 69 64 2c 20 )),. q(id,
5a80: 70 61 72 65 6e 74 2c 20 72 6e 29 20 41 53 20 28 parent, rn) AS (
5a90: 0a 20 20 20 20 20 20 20 20 20 20 56 41 4c 55 45 . VALUE
5aa0: 53 28 31 2c 32 2c 33 29 0a 20 20 20 20 20 20 20 S(1,2,3).
5ab0: 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 UNION ALL.
5ac0: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 74 2e SELECT t.
5ad0: 2a 2c 20 52 4f 57 5f 4e 55 4d 42 45 52 28 29 20 *, ROW_NUMBER()
5ae0: 4f 56 45 52 20 28 4f 52 44 45 52 20 42 59 20 74 OVER (ORDER BY t
5af0: 2e 69 64 29 20 41 53 20 72 6e 0a 20 20 20 20 20 .id) AS rn.
5b00: 20 20 20 20 20 46 52 4f 4d 20 71 20 4a 4f 49 4e FROM q JOIN
5b10: 20 74 20 4f 4e 20 74 2e 70 61 72 65 6e 74 20 3d t ON t.parent =
5b20: 20 71 2e 69 64 0a 20 20 20 20 20 20 20 20 20 20 q.id.
5b30: 29 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 ). SELECT
5b40: 20 2a 20 46 52 4f 4d 20 71 3b 0a 20 20 7d 20 7b * FROM q;. } {
5b50: 31 20 7b 63 61 6e 6e 6f 74 20 75 73 65 20 77 69 1 {cannot use wi
5b60: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 69 ndow functions i
5b70: 6e 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 n recursive quer
5b80: 69 65 73 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d ies}}.}..#------
5b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5bd0: 2d 2d 2d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 ---.do_execsql_t
5be0: 65 73 74 20 31 37 2e 31 20 7b 0a 20 20 57 49 54 est 17.1 {. WIT
5bf0: 48 20 78 28 61 29 20 41 53 20 28 0a 20 20 20 20 H x(a) AS (.
5c00: 57 49 54 48 20 79 28 62 29 20 41 53 20 28 53 45 WITH y(b) AS (SE
5c10: 4c 45 43 54 20 31 30 29 0a 20 20 20 20 53 45 4c LECT 10). SEL
5c20: 45 43 54 20 39 20 55 4e 49 4f 4e 20 41 4c 4c 20 ECT 9 UNION ALL
5c30: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 79 0a SELECT * FROM y.
5c40: 20 20 29 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 ). SELECT * F
5c50: 52 4f 4d 20 78 0a 7d 20 7b 39 20 31 30 7d 0a 0a ROM x.} {9 10}..
5c60: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 do_execsql_test
5c70: 31 37 2e 32 20 7b 0a 20 20 57 49 54 48 20 78 20 17.2 {. WITH x
5c80: 41 53 20 28 0a 20 20 20 20 57 49 54 48 20 79 28 AS (. WITH y(
5c90: 62 29 20 41 53 20 28 53 45 4c 45 43 54 20 31 30 b) AS (SELECT 10
5ca0: 29 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 ). SELECT * F
5cb0: 52 4f 4d 20 79 20 55 4e 49 4f 4e 20 41 4c 4c 20 ROM y UNION ALL
5cc0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 79 0a SELECT * FROM y.
5cd0: 20 20 29 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 ). SELECT * F
5ce0: 52 4f 4d 20 78 0a 7d 20 7b 31 30 20 31 30 7d 0a ROM x.} {10 10}.
5cf0: 0a 64 6f 5f 74 65 73 74 20 31 37 2e 32 20 7b 0a .do_test 17.2 {.
5d00: 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 db eval {.
5d10: 57 49 54 48 20 78 20 41 53 20 28 0a 20 20 20 20 WITH x AS (.
5d20: 20 20 20 20 57 49 54 48 20 79 28 62 29 20 41 53 WITH y(b) AS
5d30: 20 28 53 45 4c 45 43 54 20 31 30 29 0a 20 20 20 (SELECT 10).
5d40: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 SELECT * FR
5d50: 4f 4d 20 79 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 OM y UNION ALL S
5d60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 79 0a 20 ELECT * FROM y.
5d70: 20 20 20 29 0a 20 20 20 20 53 45 4c 45 43 54 20 ). SELECT
5d80: 2a 20 46 52 4f 4d 20 78 0a 20 20 7d 20 41 20 7b * FROM x. } A {
5d90: 0a 20 20 20 20 23 20 6e 6f 20 6f 70 0a 20 20 7d . # no op. }
5da0: 0a 20 20 73 65 74 20 41 28 2a 29 0a 7d 20 7b 62 . set A(*).} {b
5db0: 7d 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 }..do_catchsql_t
5dc0: 65 73 74 20 31 37 2e 33 20 7b 0a 20 20 57 49 54 est 17.3 {. WIT
5dd0: 48 20 69 20 41 53 20 28 0a 20 20 20 20 57 49 54 H i AS (. WIT
5de0: 48 20 6a 20 41 53 20 28 53 45 4c 45 43 54 20 35 H j AS (SELECT 5
5df0: 29 0a 20 20 20 20 53 45 4c 45 43 54 20 35 20 46 ). SELECT 5 F
5e00: 52 4f 4d 20 69 20 55 4e 49 4f 4e 20 53 45 4c 45 ROM i UNION SELE
5e10: 43 54 20 38 20 46 52 4f 4d 20 69 0a 20 20 29 0a CT 8 FROM i. ).
5e20: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 SELECT * FROM
5e30: 69 3b 0a 7d 20 7b 31 20 7b 63 69 72 63 75 6c 61 i;.} {1 {circula
5e40: 72 20 72 65 66 65 72 65 6e 63 65 3a 20 69 7d 7d r reference: i}}
5e50: 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 ..do_catchsql_te
5e60: 73 74 20 31 37 2e 34 20 7b 0a 20 20 57 49 54 48 st 17.4 {. WITH
5e70: 20 69 20 41 53 20 28 0a 20 20 20 20 57 49 54 48 i AS (. WITH
5e80: 20 6a 20 41 53 20 28 53 45 4c 45 43 54 20 35 29 j AS (SELECT 5)
5e90: 0a 20 20 20 20 53 45 4c 45 43 54 20 35 20 46 52 . SELECT 5 FR
5ea0: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 OM t1 UNION SELE
5eb0: 43 54 20 38 20 46 52 4f 4d 20 74 31 31 0a 20 20 CT 8 FROM t11.
5ec0: 29 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f ). SELECT * FRO
5ed0: 4d 20 69 3b 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 M i;.} {1 {no su
5ee0: 63 68 20 74 61 62 6c 65 3a 20 74 31 31 7d 7d 0a ch table: t11}}.
5ef0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 .do_execsql_test
5f00: 20 31 37 2e 35 20 7b 0a 20 20 57 49 54 48 20 0a 17.5 {. WITH .
5f10: 20 20 78 31 20 41 53 20 28 53 45 4c 45 43 54 20 x1 AS (SELECT
5f20: 31 30 29 2c 0a 20 20 78 32 20 41 53 20 28 53 45 10),. x2 AS (SE
5f30: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 29 2c LECT * FROM x1),
5f40: 0a 20 20 78 33 20 41 53 20 28 0a 20 20 20 20 57 . x3 AS (. W
5f50: 49 54 48 20 78 31 20 41 53 20 28 53 45 4c 45 43 ITH x1 AS (SELEC
5f60: 54 20 31 31 29 0a 20 20 20 20 53 45 4c 45 43 54 T 11). SELECT
5f70: 20 2a 20 46 52 4f 4d 20 78 32 20 55 4e 49 4f 4e * FROM x2 UNION
5f80: 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46 52 ALL SELECT * FR
5f90: 4f 4d 20 78 32 0a 20 20 29 0a 20 20 53 45 4c 45 OM x2. ). SELE
5fa0: 43 54 20 2a 20 46 52 4f 4d 20 78 33 3b 0a 7d 20 CT * FROM x3;.}
5fb0: 7b 31 30 20 31 30 7d 0a 0a 64 6f 5f 65 78 65 63 {10 10}..do_exec
5fc0: 73 71 6c 5f 74 65 73 74 20 31 37 2e 36 20 7b 0a sql_test 17.6 {.
5fd0: 20 20 57 49 54 48 20 0a 20 20 78 31 20 41 53 20 WITH . x1 AS
5fe0: 28 53 45 4c 45 43 54 20 31 30 29 2c 0a 20 20 78 (SELECT 10),. x
5ff0: 32 20 41 53 20 28 53 45 4c 45 43 54 20 2a 20 46 2 AS (SELECT * F
6000: 52 4f 4d 20 78 31 29 2c 0a 20 20 78 33 20 41 53 ROM x1),. x3 AS
6010: 20 28 0a 20 20 20 20 57 49 54 48 20 78 31 20 41 (. WITH x1 A
6020: 53 20 28 53 45 4c 45 43 54 20 31 31 29 0a 20 20 S (SELECT 11).
6030: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 SELECT * FROM
6040: 78 32 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c x2 UNION ALL SEL
6050: 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 0a 20 20 ECT * FROM x1.
6060: 29 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f ). SELECT * FRO
6070: 4d 20 78 33 3b 0a 7d 20 7b 31 30 20 31 31 7d 0a M x3;.} {10 11}.
6080: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 .do_execsql_test
6090: 20 31 37 2e 37 20 7b 0a 20 20 57 49 54 48 20 0a 17.7 {. WITH .
60a0: 20 20 78 31 20 41 53 20 28 53 45 4c 45 43 54 20 x1 AS (SELECT
60b0: 31 30 29 2c 0a 20 20 78 32 20 41 53 20 28 53 45 10),. x2 AS (SE
60c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 29 2c LECT * FROM x1),
60d0: 0a 20 20 78 33 20 41 53 20 28 0a 20 20 20 20 57 . x3 AS (. W
60e0: 49 54 48 20 0a 20 20 20 20 20 20 78 31 20 41 53 ITH . x1 AS
60f0: 20 28 20 53 45 4c 45 43 54 20 31 31 20 29 2c 0a ( SELECT 11 ),.
6100: 20 20 20 20 20 20 78 34 20 41 53 20 28 20 53 45 x4 AS ( SE
6110: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 20 29 LECT * FROM x2 )
6120: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 . SELECT * FR
6130: 4f 4d 20 78 34 20 55 4e 49 4f 4e 20 41 4c 4c 20 OM x4 UNION ALL
6140: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 SELECT * FROM x1
6150: 0a 20 20 29 0a 20 20 53 45 4c 45 43 54 20 2a 20 . ). SELECT *
6160: 46 52 4f 4d 20 78 33 3b 0a 7d 20 7b 31 30 20 31 FROM x3;.} {10 1
6170: 31 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 1}..do_execsql_t
6180: 65 73 74 20 31 37 2e 38 20 7b 0a 20 20 57 49 54 est 17.8 {. WIT
6190: 48 20 0a 20 20 78 31 20 41 53 20 28 53 45 4c 45 H . x1 AS (SELE
61a0: 43 54 20 31 30 29 2c 0a 20 20 78 32 20 41 53 20 CT 10),. x2 AS
61b0: 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 (SELECT * FROM x
61c0: 31 29 2c 0a 20 20 78 33 20 41 53 20 28 0a 20 20 1),. x3 AS (.
61d0: 20 20 57 49 54 48 20 0a 20 20 20 20 20 20 78 31 WITH . x1
61e0: 20 41 53 20 28 20 53 45 4c 45 43 54 20 31 31 20 AS ( SELECT 11
61f0: 29 2c 0a 20 20 20 20 20 20 78 34 20 41 53 20 28 ),. x4 AS (
6200: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 SELECT * FROM x
6210: 32 20 29 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 2 ). SELECT *
6220: 20 46 52 4f 4d 20 78 34 20 55 4e 49 4f 4e 20 41 FROM x4 UNION A
6230: 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d LL SELECT * FROM
6240: 20 78 31 0a 20 20 29 0a 20 20 53 45 4c 45 43 54 x1. ). SELECT
6250: 20 2a 20 46 52 4f 4d 20 78 33 3b 0a 7d 20 7b 31 * FROM x3;.} {1
6260: 30 20 31 31 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 0 11}..do_execsq
6270: 6c 5f 74 65 73 74 20 31 37 2e 39 20 7b 0a 20 20 l_test 17.9 {.
6280: 57 49 54 48 20 0a 20 20 78 31 20 41 53 20 28 53 WITH . x1 AS (S
6290: 45 4c 45 43 54 20 31 30 29 2c 0a 20 20 78 32 20 ELECT 10),. x2
62a0: 41 53 20 28 53 45 4c 45 43 54 20 31 31 29 2c 0a AS (SELECT 11),.
62b0: 20 20 78 33 20 41 53 20 28 0a 20 20 20 20 53 45 x3 AS (. SE
62c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20 55 LECT * FROM x1 U
62d0: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 NION ALL SELECT
62e0: 2a 20 46 52 4f 4d 20 78 32 0a 20 20 29 2c 0a 20 * FROM x2. ),.
62f0: 20 78 34 20 41 53 20 28 0a 20 20 20 20 57 49 54 x4 AS (. WIT
6300: 48 20 0a 20 20 20 20 78 31 20 41 53 20 28 53 45 H . x1 AS (SE
6310: 4c 45 43 54 20 31 32 29 2c 0a 20 20 20 20 78 32 LECT 12),. x2
6320: 20 41 53 20 28 53 45 4c 45 43 54 20 31 33 29 0a AS (SELECT 13).
6330: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f SELECT * FRO
6340: 4d 20 78 33 0a 20 20 29 0a 20 20 53 45 4c 45 43 M x3. ). SELEC
6350: 54 20 2a 20 46 52 4f 4d 20 78 34 3b 0a 7d 20 7b T * FROM x4;.} {
6360: 31 30 20 31 31 7d 0a 0a 23 20 41 64 64 65 64 20 10 11}..# Added
6370: 74 6f 20 74 65 73 74 20 61 20 66 69 78 20 74 6f to test a fix to
6380: 20 61 20 66 61 75 6c 74 79 20 61 73 73 65 72 74 a faulty assert
6390: 28 29 20 64 69 73 63 6f 76 65 72 65 64 20 62 79 () discovered by
63a0: 20 6c 69 62 46 75 7a 7a 65 72 2e 0a 23 0a 64 6f libFuzzer..#.do
63b0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 38 _execsql_test 18
63c0: 2e 31 20 7b 0a 20 20 57 49 54 48 20 78 79 7a 28 .1 {. WITH xyz(
63d0: 78 29 20 41 53 20 28 56 41 4c 55 45 53 28 4e 55 x) AS (VALUES(NU
63e0: 4c 4c 29 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 LL) UNION SELECT
63f0: 20 72 6f 75 6e 64 28 31 3c 78 29 20 46 52 4f 4d round(1<x) FROM
6400: 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20 31 29 xyz ORDER BY 1)
6410: 0a 20 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28 . SELECT quote(
6420: 78 29 20 46 52 4f 4d 20 78 79 7a 3b 0a 7d 20 7b x) FROM xyz;.} {
6430: 4e 55 4c 4c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c NULL}.do_execsql
6440: 5f 74 65 73 74 20 31 38 2e 32 20 7b 0a 20 20 57 _test 18.2 {. W
6450: 49 54 48 20 78 79 7a 28 78 29 20 41 53 20 28 0a ITH xyz(x) AS (.
6460: 20 20 20 20 53 45 4c 45 43 54 20 70 72 69 6e 74 SELECT print
6470: 66 28 27 25 64 27 2c 20 35 29 20 2a 20 4e 55 4c f('%d', 5) * NUL
6480: 4c 0a 20 20 20 20 55 4e 49 4f 4e 20 53 45 4c 45 L. UNION SELE
6490: 43 54 20 72 6f 75 6e 64 28 31 3c 31 2b 78 29 20 CT round(1<1+x)
64a0: 0a 20 20 20 20 46 52 4f 4d 20 78 79 7a 20 4f 52 . FROM xyz OR
64b0: 44 45 52 20 42 59 20 31 0a 20 20 29 0a 20 20 53 DER BY 1. ). S
64c0: 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 78 79 7a ELECT 1 FROM xyz
64d0: 3b 0a 7d 20 31 0a 0a 23 20 45 58 50 4c 41 49 4e ;.} 1..# EXPLAIN
64e0: 20 51 55 45 52 59 20 50 4c 41 4e 20 6f 6e 20 61 QUERY PLAN on a
64f0: 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61 20 self-join of a
6500: 43 54 45 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c CTE.#.do_execsql
6510: 5f 74 65 73 74 20 31 39 2e 31 61 20 7b 0a 20 20 _test 19.1a {.
6520: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 DROP TABLE IF EX
6530: 49 53 54 53 20 74 31 3b 0a 20 20 43 52 45 41 54 ISTS t1;. CREAT
6540: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 7d E TABLE t1(x);.}
6550: 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 39 2e .do_eqp_test 19.
6560: 31 62 20 7b 0a 20 20 57 49 54 48 0a 20 20 20 20 1b {. WITH.
6570: 78 31 28 61 29 20 41 53 20 28 76 61 6c 75 65 73 x1(a) AS (values
6580: 28 31 30 30 29 29 0a 20 20 49 4e 53 45 52 54 20 (100)). INSERT
6590: 49 4e 54 4f 20 74 31 28 78 29 0a 20 20 20 20 53 INTO t1(x). S
65a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 57 49 ELECT * FROM (WI
65b0: 54 48 20 78 32 28 79 29 20 41 53 20 28 53 45 4c TH x2(y) AS (SEL
65c0: 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 29 20 53 ECT * FROM x1) S
65d0: 45 4c 45 43 54 20 79 2b 61 20 46 52 4f 4d 20 78 ELECT y+a FROM x
65e0: 31 2c 20 78 32 29 3b 0a 20 20 53 45 4c 45 43 54 1, x2);. SELECT
65f0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 0a * FROM t1;.} {.
6600: 20 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 7c QUERY PLAN. |
6610: 2d 2d 4d 41 54 45 52 49 41 4c 49 5a 45 20 78 78 --MATERIALIZE xx
6620: 78 78 78 78 0a 20 20 7c 20 20 60 2d 2d 53 43 41 xxxx. | `--SCA
6630: 4e 20 43 4f 4e 53 54 41 4e 54 20 52 4f 57 0a 20 N CONSTANT ROW.
6640: 20 7c 2d 2d 53 43 41 4e 20 53 55 42 51 55 45 52 |--SCAN SUBQUER
6650: 59 20 78 78 78 78 78 78 0a 20 20 60 2d 2d 53 43 Y xxxxxx. `--SC
6660: 41 4e 20 53 55 42 51 55 45 52 59 20 78 78 78 78 AN SUBQUERY xxxx
6670: 78 78 0a 7d 0a 0a 23 20 32 30 31 37 2d 31 30 2d xx.}..# 2017-10-
6680: 32 38 2e 0a 23 20 53 65 65 20 63 68 65 63 6b 2d 28..# See check-
6690: 69 6e 20 68 74 74 70 73 3a 2f 2f 73 71 6c 69 74 in https://sqlit
66a0: 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 30 e.org/src/info/0
66b0: 39 32 36 64 66 30 39 35 66 61 66 37 32 63 32 0a 926df095faf72c2.
66c0: 23 20 54 72 69 65 64 20 74 6f 20 6f 70 74 69 6d # Tried to optim
66d0: 69 7a 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 70 ize co-routine p
66e0: 72 6f 63 65 73 73 69 6e 67 20 62 79 20 63 68 61 rocessing by cha
66f0: 6e 67 69 6e 67 20 61 20 43 6f 70 79 20 6f 70 63 nging a Copy opc
6700: 6f 64 65 0a 23 20 69 6e 74 6f 20 53 43 6f 70 79 ode.# into SCopy
6710: 2e 20 20 42 75 74 20 4f 53 53 46 75 7a 7a 20 66 . But OSSFuzz f
6720: 6f 75 6e 64 20 74 77 6f 20 28 73 69 6d 69 6c 61 ound two (simila
6730: 72 29 20 63 61 73 65 73 20 77 68 65 72 65 20 74 r) cases where t
6740: 68 61 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e hat optimization
6750: 0a 23 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b .# does not work
6760: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 ..#.do_execsql_t
6770: 65 73 74 20 32 30 2e 31 20 7b 0a 20 20 57 49 54 est 20.1 {. WIT
6780: 48 20 63 28 69 29 41 53 28 56 41 4c 55 45 53 28 H c(i)AS(VALUES(
6790: 39 29 55 4e 49 4f 4e 20 53 45 4c 45 43 54 7e 69 9)UNION SELECT~i
67a0: 20 46 52 4f 4d 20 63 29 53 45 4c 45 43 54 20 6d FROM c)SELECT m
67b0: 61 78 28 35 29 3e 69 20 66 52 4f 4d 20 63 3b 0a ax(5)>i fROM c;.
67c0: 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c } {0}.do_execsql
67d0: 5f 74 65 73 74 20 32 30 2e 32 20 7b 0a 20 20 57 _test 20.2 {. W
67e0: 49 54 48 20 63 28 69 29 41 53 28 56 41 4c 55 45 ITH c(i)AS(VALUE
67f0: 53 28 35 29 55 4e 49 6f 4e 20 53 45 4c 45 43 54 S(5)UNIoN SELECT
6800: 20 30 29 53 45 4c 45 43 54 20 6d 69 6e 28 31 29 0)SELECT min(1)
6810: 2d 69 20 66 52 4f 4d 20 63 3b 0a 7d 20 7b 31 7d -i fROM c;.} {1}
6820: 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a ..finish_test.