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

     1  # 2008 June 24
     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. 
    12  #
    13  # $Id: selectB.test,v 1.10 2009/04/02 16:59:47 drh Exp $
    14  
    15  set testdir [file dirname $argv0]
    16  source $testdir/tester.tcl
    17  
    18  ifcapable !compound {
    19    finish_test
    20    return
    21  }
    22  
    23  proc test_transform {testname sql1 sql2 results} {
    24    set ::vdbe1 [list]
    25    set ::vdbe2 [list]
    26    db eval "explain $sql1" { lappend ::vdbe1 $opcode }
    27    db eval "explain $sql2" { lappend ::vdbe2 $opcode }
    28  
    29    do_test $testname.transform {
    30      set ::vdbe1
    31    } $::vdbe2
    32  
    33    set ::sql1 $sql1
    34    do_test $testname.sql1 {
    35      execsql $::sql1
    36    } $results
    37  
    38    set ::sql2 $sql2
    39    do_test $testname.sql2 {
    40      execsql $::sql2
    41    } $results
    42  }
    43  
    44  do_test selectB-1.1 {
    45    execsql {
    46      CREATE TABLE t1(a, b, c);
    47      CREATE TABLE t2(d, e, f);
    48  
    49      INSERT INTO t1 VALUES( 2,  4,  6);
    50      INSERT INTO t1 VALUES( 8, 10, 12);
    51      INSERT INTO t1 VALUES(14, 16, 18);
    52  
    53      INSERT INTO t2 VALUES(3,   6,  9);
    54      INSERT INTO t2 VALUES(12, 15, 18);
    55      INSERT INTO t2 VALUES(21, 24, 27);
    56    }
    57  } {}
    58  
    59  for {set ii 1} {$ii <= 2} {incr ii} {
    60  
    61    if {$ii == 2} {
    62      do_test selectB-2.1 {
    63        execsql {
    64          CREATE INDEX i1 ON t1(a);
    65          CREATE INDEX i2 ON t2(d);
    66        }
    67      } {}
    68    }
    69  
    70    test_transform selectB-$ii.2 {
    71      SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
    72    } {
    73      SELECT a FROM t1 UNION ALL SELECT d FROM t2
    74    } {2 8 14 3 12 21}
    75    
    76    test_transform selectB-$ii.3 {
    77      SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1
    78    } {
    79      SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1
    80    } {2 3 8 12 14 21}
    81    
    82    test_transform selectB-$ii.4 {
    83      SELECT * FROM 
    84        (SELECT a FROM t1 UNION ALL SELECT d FROM t2) 
    85      WHERE a>10 ORDER BY 1
    86    } {
    87      SELECT a FROM t1 WHERE a>10 UNION ALL SELECT d FROM t2 WHERE d>10 ORDER BY 1
    88    } {12 14 21}
    89    
    90    test_transform selectB-$ii.5 {
    91      SELECT * FROM 
    92        (SELECT a FROM t1 UNION ALL SELECT d FROM t2) 
    93      WHERE a>10 ORDER BY a
    94    } {
    95      SELECT a FROM t1 WHERE a>10 
    96        UNION ALL 
    97      SELECT d FROM t2 WHERE d>10 
    98      ORDER BY a
    99    } {12 14 21}
   100    
   101    test_transform selectB-$ii.6 {
   102      SELECT * FROM 
   103        (SELECT a FROM t1 UNION ALL SELECT d FROM t2 WHERE d > 12) 
   104      WHERE a>10 ORDER BY a
   105    } {
   106      SELECT a FROM t1 WHERE a>10
   107        UNION ALL 
   108      SELECT d FROM t2 WHERE d>12 AND d>10
   109      ORDER BY a
   110    } {14 21}
   111    
   112    test_transform selectB-$ii.7 {
   113      SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1 
   114      LIMIT 2
   115    } {
   116      SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 LIMIT 2
   117    } {2 3}
   118    
   119    test_transform selectB-$ii.8 {
   120      SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1 
   121      LIMIT 2 OFFSET 3
   122    } {
   123      SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 LIMIT 2 OFFSET 3
   124    } {12 14}
   125  
   126    test_transform selectB-$ii.9 {
   127      SELECT * FROM (
   128        SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
   129      ) 
   130    } {
   131      SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
   132    } {2 8 14 3 12 21 6 12 18}
   133    
   134    test_transform selectB-$ii.10 {
   135      SELECT * FROM (
   136        SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
   137      ) ORDER BY 1
   138    } {
   139      SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
   140      ORDER BY 1
   141    } {2 3 6 8 12 12 14 18 21}
   142    
   143    test_transform selectB-$ii.11 {
   144      SELECT * FROM (
   145        SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
   146      ) WHERE a>=10 ORDER BY 1 LIMIT 3
   147    } {
   148      SELECT a FROM t1 WHERE a>=10 UNION ALL SELECT d FROM t2 WHERE d>=10
   149      UNION ALL SELECT c FROM t1 WHERE c>=10
   150      ORDER BY 1 LIMIT 3
   151    } {12 12 14}
   152  
   153    test_transform selectB-$ii.12 {
   154      SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 2)
   155    } {
   156      SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 2
   157    } {2 8}
   158  
   159    # An ORDER BY in a compound subqueries defeats flattening.  Ticket #3773
   160    # test_transform selectB-$ii.13 {
   161    #   SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY a ASC)
   162    # } {
   163    #   SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 ASC
   164    # } {2 3 8 12 14 21}
   165    # 
   166    # test_transform selectB-$ii.14 {
   167    #  SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY a DESC)
   168    # } {
   169    #  SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 DESC
   170    # } {21 14 12 8 3 2}
   171    #
   172    # test_transform selectB-$ii.14 {
   173    #   SELECT * FROM (
   174    #     SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY a DESC
   175    #   ) LIMIT 2 OFFSET 2
   176    # } {
   177    #   SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 DESC
   178    #    LIMIT 2 OFFSET 2
   179    # } {12 8}
   180    #
   181    # test_transform selectB-$ii.15 {
   182    #   SELECT * FROM (
   183    #     SELECT a, b FROM t1 UNION ALL SELECT d, e FROM t2 ORDER BY a ASC, e DESC
   184    #  )
   185    # } {
   186    #   SELECT a, b FROM t1 UNION ALL SELECT d, e FROM t2 ORDER BY a ASC, e DESC
   187    # } {2 4 3 6 8 10 12 15 14 16 21 24}
   188  }
   189  
   190  do_test selectB-3.0 {
   191    execsql {
   192      DROP INDEX i1;
   193      DROP INDEX i2;
   194    }
   195  } {}
   196  
   197  for {set ii 3} {$ii <= 6} {incr ii} {
   198  
   199    switch $ii {
   200      4 {
   201        optimization_control db query-flattener off
   202      }
   203      5 {
   204        optimization_control db query-flattener on
   205        do_test selectB-5.0 {
   206          execsql {
   207            CREATE INDEX i1 ON t1(a);
   208            CREATE INDEX i2 ON t1(b);
   209            CREATE INDEX i3 ON t1(c);
   210            CREATE INDEX i4 ON t2(d);
   211            CREATE INDEX i5 ON t2(e);
   212            CREATE INDEX i6 ON t2(f);
   213          }
   214        } {}
   215      }
   216      6 {
   217        optimization_control db query-flattener off
   218      }
   219    }
   220  
   221    do_test selectB-$ii.1 {
   222      execsql {
   223        SELECT DISTINCT * FROM 
   224          (SELECT c FROM t1 UNION ALL SELECT e FROM t2) 
   225        ORDER BY 1;
   226      }
   227    } {6 12 15 18 24}
   228    
   229    do_test selectB-$ii.2 {
   230      execsql {
   231        SELECT c, count(*) FROM 
   232          (SELECT c FROM t1 UNION ALL SELECT e FROM t2) 
   233        GROUP BY c ORDER BY 1;
   234      }
   235    } {6 2 12 1 15 1 18 1 24 1}
   236    do_test selectB-$ii.3 {
   237      execsql {
   238        SELECT c, count(*) FROM 
   239          (SELECT c FROM t1 UNION ALL SELECT e FROM t2) 
   240        GROUP BY c HAVING count(*)>1;
   241      }
   242    } {6 2}
   243    do_test selectB-$ii.4 {
   244      execsql {
   245        SELECT t4.c, t3.a FROM 
   246          (SELECT c FROM t1 UNION ALL SELECT e FROM t2) AS t4, t1 AS t3
   247        WHERE t3.a=14
   248        ORDER BY 1
   249      }
   250    } {6 14 6 14 12 14 15 14 18 14 24 14}
   251    
   252    do_test selectB-$ii.5 {
   253      execsql {
   254        SELECT d FROM t2 
   255        EXCEPT 
   256        SELECT a FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
   257      }
   258    } {}
   259    do_test selectB-$ii.6 {
   260      execsql {
   261        SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
   262        EXCEPT 
   263        SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
   264      }
   265    } {}
   266    do_test selectB-$ii.7 {
   267      execsql {
   268        SELECT c FROM t1
   269        EXCEPT 
   270        SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
   271      }
   272    } {12}
   273    do_test selectB-$ii.8 {
   274      execsql {
   275        SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
   276        EXCEPT 
   277        SELECT c FROM t1
   278      }
   279    } {9 15 24 27}
   280    do_test selectB-$ii.9 {
   281      execsql {
   282        SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
   283        EXCEPT 
   284        SELECT c FROM t1
   285        ORDER BY c DESC
   286      }
   287    } {27 24 15 9}
   288    
   289    do_test selectB-$ii.10 {
   290      execsql {
   291        SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
   292        UNION 
   293        SELECT c FROM t1
   294        ORDER BY c DESC
   295      }
   296    } {27 24 18 15 12 9 6}
   297    do_test selectB-$ii.11 {
   298      execsql {
   299        SELECT c FROM t1
   300        UNION 
   301        SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
   302        ORDER BY c
   303      }
   304    } {6 9 12 15 18 24 27}
   305    do_test selectB-$ii.12 {
   306      execsql {
   307        SELECT c FROM t1 UNION SELECT e FROM t2 UNION ALL SELECT f FROM t2
   308        ORDER BY c
   309      }
   310    } {6 9 12 15 18 18 24 27}
   311    do_test selectB-$ii.13 {
   312      execsql {
   313        SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
   314        UNION 
   315        SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
   316        ORDER BY 1
   317      }
   318    } {6 9 15 18 24 27}
   319    
   320    do_test selectB-$ii.14 {
   321      execsql {
   322        SELECT c FROM t1
   323        INTERSECT 
   324        SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
   325        ORDER BY 1
   326      }
   327    } {6 18}
   328    do_test selectB-$ii.15 {
   329      execsql {
   330        SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
   331        INTERSECT 
   332        SELECT c FROM t1
   333        ORDER BY 1
   334      }
   335    } {6 18}
   336    do_test selectB-$ii.16 {
   337      execsql {
   338        SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
   339        INTERSECT 
   340        SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
   341        ORDER BY 1
   342      }
   343    } {6 9 15 18 24 27}
   344  
   345    do_test selectB-$ii.17 {
   346      execsql {
   347        SELECT * FROM (
   348          SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 4
   349        ) LIMIT 2
   350      }
   351    } {2 8}
   352  
   353    do_test selectB-$ii.18 {
   354      execsql {
   355        SELECT * FROM (
   356          SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 4 OFFSET 2
   357        ) LIMIT 2
   358      }
   359    } {14 3}
   360  
   361    do_test selectB-$ii.19 {
   362      execsql {
   363        SELECT * FROM (
   364          SELECT DISTINCT (a/10) FROM t1 UNION ALL SELECT DISTINCT(d%2) FROM t2
   365        )
   366      }
   367    } {0 1 1 0}
   368  
   369    do_test selectB-$ii.20 {
   370      execsql {
   371        SELECT DISTINCT * FROM (
   372          SELECT DISTINCT (a/10) FROM t1 UNION ALL SELECT DISTINCT(d%2) FROM t2
   373        )
   374      }
   375    } {0 1}
   376  
   377    do_test selectB-$ii.21 {
   378      execsql {
   379        SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t2) ORDER BY a+b
   380      }
   381    } {2 4 6 3 6 9 8 10 12 12 15 18 14 16 18 21 24 27}
   382  
   383    do_test selectB-$ii.22 {
   384      execsql {
   385        SELECT * FROM (SELECT 345 UNION ALL SELECT d FROM t2) ORDER BY 1;
   386      }
   387    } {3 12 21 345}
   388  
   389    do_test selectB-$ii.23 {
   390      execsql {
   391        SELECT x, y FROM (
   392          SELECT a AS x, b AS y FROM t1
   393          UNION ALL
   394          SELECT a*10 + 0.1, f*10 + 0.1 FROM t1 JOIN t2 ON (c=d)
   395          UNION ALL
   396          SELECT a*100, b*100 FROM t1
   397        ) ORDER BY 1;
   398      }
   399    } {2 4 8 10 14 16 80.1 180.1 200 400 800 1000 1400 1600}
   400  
   401    do_test selectB-$ii.24 {
   402      execsql {
   403        SELECT x, y FROM (
   404          SELECT a AS x, b AS y FROM t1
   405          UNION ALL
   406          SELECT a*10 + 0.1, f*10 + 0.1 FROM t1 LEFT JOIN t2 ON (c=d)
   407          UNION ALL
   408          SELECT a*100, b*100 FROM t1
   409        ) ORDER BY 1;
   410      }
   411    } {2 4 8 10 14 16 20.1 {} 80.1 180.1 140.1 {} 200 400 800 1000 1400 1600}
   412  
   413    do_test selectB-$ii.25 {
   414      execsql {
   415        SELECT x+y FROM (
   416          SELECT a AS x, b AS y FROM t1
   417          UNION ALL
   418          SELECT a*10 + 0.1, f*10 + 0.1 FROM t1 LEFT JOIN t2 ON (c=d)
   419          UNION ALL
   420          SELECT a*100, b*100 FROM t1
   421        ) WHERE y+x NOT NULL ORDER BY 1;
   422      }
   423    } {6 18 30 260.2 600 1800 3000}
   424  }
   425  
   426  finish_test