gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/with5.test (about)

     1  # 2020-10-19
     2  #
     3  # The author disclaims copyright to this source code.  In place of
     4  # a legal notice, here is a blessing:
     5  #
     6  #    May you do good and not evil.
     7  #    May you find forgiveness for yourself and forgive others.
     8  #    May you share freely, never taking more than you give.
     9  #
    10  #***********************************************************************
    11  # This file implements regression tests for SQLite library.  The
    12  # focus of this file is recursive common table expressions with
    13  # multiple recursive terms in the compound select.
    14  #
    15  
    16  set testdir [file dirname $argv0]
    17  source $testdir/tester.tcl
    18  set ::testprefix with5
    19  
    20  ifcapable {!cte} {
    21    finish_test
    22    return
    23  }
    24  
    25  do_execsql_test 100 {
    26    CREATE TABLE link(aa INT, bb INT);
    27    CREATE INDEX link_f ON link(aa,bb);
    28    CREATE INDEX link_t ON link(bb,aa);
    29    INSERT INTO link(aa,bb) VALUES
    30      (1,3),
    31      (5,3),
    32      (7,1),
    33      (7,9),
    34      (9,9),
    35      (5,11),
    36      (11,7),
    37      (2,4),
    38      (4,6),
    39      (8,6);
    40  } {}
    41  do_execsql_test 110 {
    42    WITH RECURSIVE closure(x) AS (
    43       VALUES(1)
    44       UNION
    45       SELECT aa FROM closure, link WHERE link.bb=closure.x
    46       UNION
    47       SELECT bb FROM closure, link WHERE link.aa=closure.x
    48    )
    49    SELECT x FROM closure ORDER BY x;
    50  } {1 3 5 7 9 11}
    51  do_execsql_test 111 {
    52    WITH RECURSIVE closure(x) AS (
    53       VALUES(1)
    54       UNION
    55       SELECT aa FROM link, closure WHERE link.bb=closure.x
    56       UNION
    57       SELECT bb FROM closure, link WHERE link.aa=closure.x
    58    )
    59    SELECT x FROM closure ORDER BY x;
    60  } {1 3 5 7 9 11}
    61  do_execsql_test 112 {
    62    WITH RECURSIVE closure(x) AS (
    63       VALUES(1)
    64       UNION
    65       SELECT bb FROM closure, link WHERE link.aa=closure.x
    66       UNION
    67       SELECT aa FROM link, closure WHERE link.bb=closure.x
    68    )
    69    SELECT x FROM closure ORDER BY x;
    70  } {1 3 5 7 9 11}
    71  do_execsql_test 113 {
    72    WITH RECURSIVE closure(x) AS (
    73       VALUES(1),(200),(300),(400)
    74       INTERSECT
    75       VALUES(1)
    76       UNION
    77       SELECT bb FROM closure, link WHERE link.aa=closure.x
    78       UNION
    79       SELECT aa FROM link, closure WHERE link.bb=closure.x
    80    )
    81    SELECT x FROM closure ORDER BY x;
    82  } {1 3 5 7 9 11}
    83  do_execsql_test 114 {
    84    WITH RECURSIVE closure(x) AS (
    85       VALUES(1),(200),(300),(400)
    86       UNION ALL
    87       VALUES(2)
    88       UNION
    89       SELECT bb FROM closure, link WHERE link.aa=closure.x
    90       UNION
    91       SELECT aa FROM link, closure WHERE link.bb=closure.x
    92    )
    93    SELECT x FROM closure ORDER BY x;
    94  } {1 2 3 4 5 6 7 8 9 11 200 300 400}
    95  
    96  do_catchsql_test 120 {
    97    WITH RECURSIVE closure(x) AS (
    98       VALUES(1),(200),(300),(400)
    99       UNION ALL
   100       VALUES(2)
   101       UNION ALL
   102       SELECT bb FROM closure, link WHERE link.aa=closure.x
   103       UNION
   104       SELECT aa FROM link, closure WHERE link.bb=closure.x
   105    )
   106    SELECT x FROM closure ORDER BY x;
   107  } {1 {circular reference: closure}}
   108  do_catchsql_test 121 {
   109    WITH RECURSIVE closure(x) AS (
   110       VALUES(1),(200),(300),(400)
   111       UNION ALL
   112       VALUES(2)
   113       UNION
   114       SELECT bb FROM closure, link WHERE link.aa=closure.x
   115       UNION ALL
   116       SELECT aa FROM link, closure WHERE link.bb=closure.x
   117    )
   118    SELECT x FROM closure ORDER BY x;
   119  } {1 {circular reference: closure}}
   120  
   121  do_execsql_test 130 {
   122    WITH RECURSIVE closure(x) AS (
   123      SELECT 1 AS x
   124      UNION
   125      SELECT aa FROM link JOIN closure ON bb=x
   126      UNION
   127      SELECT bb FROM link JOIN closure on aa=x
   128      ORDER BY x LIMIT 4
   129    )
   130    SELECT * FROM closure;
   131  } {1 3 5 7}
   132  do_execsql_test 131 {
   133    WITH RECURSIVE closure(x) AS (
   134      SELECT 1 AS x
   135      UNION ALL
   136      SELECT 2
   137      UNION
   138      SELECT aa FROM link JOIN closure ON bb=x
   139      UNION
   140      SELECT bb FROM link JOIN closure on aa=x
   141      ORDER BY x LIMIT 4
   142    )
   143    SELECT * FROM closure;
   144  } {1 2 3 4}
   145  
   146  do_execsql_test 200 {
   147    CREATE TABLE linkA(aa1,aa2);
   148    INSERT INTO linkA(aa1,aa2) VALUES(1,3),(5,7),(9,11);
   149    CREATE TABLE linkB(bb1,bb2);
   150    INSERT INTO linkB(bb1,bb2) VALUES(7,9),(11,13),(3,5);
   151    CREATE TABLE linkC(cc1,cc2);
   152    INSERT INTO linkC(cc1,cc2) VALUES(1,2),(2,4),(6,8);
   153    CREATE TABLE linkD(dd1,dd2);
   154    INSERT INTO linkD(dd1,dd2) VALUES(4,6),(100,110);
   155  } {}
   156  do_execsql_test 210 {
   157    WITH RECURSIVE closure(x) AS (
   158      VALUES(1)
   159      UNION ALL
   160      SELECT aa2 FROM linkA JOIN closure ON x=aa1
   161      UNION ALL
   162      SELECT bb2 FROM linkB JOIN closure ON x=bb1
   163      UNION ALL
   164      SELECT cc2 FROM linkC JOIN closure ON x=cc1
   165      UNION ALL
   166      SELECT dd2 FROM linkD JOIN closure ON x=dd1
   167    )
   168    SELECT x FROM closure ORDER BY +x;
   169  } {1 2 3 4 5 6 7 8 9 11 13}
   170  do_execsql_test 220 {
   171    CREATE TABLE linkA_ipk(aa1 INTEGER PRIMARY KEY,aa2);
   172    INSERT INTO linkA_ipk(aa1,aa2) SELECT aa1, aa2 FROM linkA;
   173    CREATE TABLE linkB_ipk(bb1 INTEGER PRIMARY KEY,bb2);
   174    INSERT INTO linkB_ipk(bb1,bb2) SELECT bb1, bb2 FROM linkB;
   175    CREATE TABLE linkC_ipk(cc1 INTEGER PRIMARY KEY,cc2);
   176    INSERT INTO linkC_ipk(cc1,cc2) SELECT cc1, cc2 FROM linkC;
   177    CREATE TABLE linkD_ipk(dd1 INTEGER PRIMARY KEY,dd2);
   178    INSERT INTO linkD_ipk(dd1,dd2) SELECT dd1, dd2 FROM linkD;
   179    WITH RECURSIVE closure(x) AS (
   180      VALUES(1)
   181      UNION ALL
   182      SELECT aa2 FROM linkA_ipk JOIN closure ON x=aa1
   183      UNION ALL
   184      SELECT bb2 FROM linkB_ipk JOIN closure ON x=bb1
   185      UNION ALL
   186      SELECT cc2 FROM linkC_ipk JOIN closure ON x=cc1
   187      UNION ALL
   188      SELECT dd2 FROM linkD_ipk JOIN closure ON x=dd1
   189    )
   190    SELECT x FROM closure ORDER BY +x;
   191  } {1 2 3 4 5 6 7 8 9 11 13}
   192  
   193  
   194  finish_test