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

     1  # 2014-03-21
     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 testing that the block-sort optimization.
    13  #
    14  
    15  
    16  set testdir [file dirname $argv0]
    17  source $testdir/tester.tcl
    18  set ::testprefix orderby6
    19  
    20  # Run all tests twice.  Once with a normal table and a second time
    21  # with a WITHOUT ROWID table
    22  #
    23  foreach {tn rowidclause} {1 {} 2 {WITHOUT ROWID}} {
    24  
    25    # Construct a table with 1000 rows and a split primary key
    26    #
    27    reset_db
    28    do_test $tn.1 {
    29      db eval "CREATE TABLE t1(a,b,c,PRIMARY KEY(b,c)) $rowidclause;"
    30      db eval {
    31        WITH RECURSIVE
    32         cnt(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM cnt WHERE x<1000)
    33       INSERT INTO t1 SELECT x, x%40, x/40 FROM cnt;
    34      }
    35    } {}
    36  
    37    # Run various ORDER BY queries that can benefit from block-sort.
    38    # Compare the output to the same output using a full-sort enforced
    39    # by adding + to each term of the ORDER BY clause.
    40    #
    41    do_execsql_test $tn.2 {
    42      SELECT b,a,c FROM t1 ORDER BY b,a,c;
    43    } [db eval {SELECT b,a,c FROM t1 ORDER BY +b,+a,+c}]
    44    do_execsql_test $tn.3 {
    45      SELECT b,a,c FROM t1 ORDER BY b,c DESC,a;
    46    } [db eval {SELECT b,a,c FROM t1 ORDER BY +b,+c DESC,+a}]
    47    do_execsql_test $tn.4 {
    48      SELECT b,a,c FROM t1 ORDER BY b DESC,c,a;
    49    } [db eval {SELECT b,a,c FROM t1 ORDER BY +b DESC,+c,+a}]
    50    do_execsql_test $tn.5 {
    51      SELECT b,a,c FROM t1 ORDER BY b DESC,a,c;
    52    } [db eval {SELECT b,a,c FROM t1 ORDER BY +b DESC,+a,+c}]
    53  
    54    # LIMIT and OFFSET clauses on block-sort queries.
    55    #
    56    do_execsql_test $tn.11 {
    57      SELECT a FROM t1 ORDER BY b, a LIMIT 10 OFFSET 20;
    58    } {840 880 920 960 1000 1 41 81 121 161}
    59    do_execsql_test $tn.11x {
    60      SELECT a FROM t1 ORDER BY +b, a LIMIT 10 OFFSET 20;
    61    } {840 880 920 960 1000 1 41 81 121 161}
    62  
    63    do_execsql_test $tn.12 {
    64      SELECT a FROM t1 ORDER BY b DESC, a LIMIT 10 OFFSET 20;
    65    } {839 879 919 959 999 38 78 118 158 198}
    66    do_execsql_test $tn.12 {
    67      SELECT a FROM t1 ORDER BY +b DESC, a LIMIT 10 OFFSET 20;
    68    } {839 879 919 959 999 38 78 118 158 198}
    69  
    70    do_execsql_test $tn.13 {
    71      SELECT a FROM t1 ORDER BY b, a DESC LIMIT 10 OFFSET 45;
    72    } {161 121 81 41 1 962 922 882 842 802}
    73    do_execsql_test $tn.13x {
    74      SELECT a FROM t1 ORDER BY +b, a DESC LIMIT 10 OFFSET 45;
    75    } {161 121 81 41 1 962 922 882 842 802}
    76  
    77    do_execsql_test $tn.14 {
    78      SELECT a FROM t1 ORDER BY b DESC, a LIMIT 10 OFFSET 45;
    79    } {838 878 918 958 998 37 77 117 157 197}
    80    do_execsql_test $tn.14x {
    81      SELECT a FROM t1 ORDER BY +b DESC, a LIMIT 10 OFFSET 45;
    82    } {838 878 918 958 998 37 77 117 157 197}
    83  
    84    # Many test cases where the LIMIT+OFFSET window is in various
    85    # alignments with block-sort boundaries.
    86    #
    87    foreach {tx limit offset orderby} {
    88       1  10 24 {+b,+a}
    89       2  10 25 {+b,+a}
    90       3  10 26 {+b,+a}
    91       4  10 39 {+b,+a}
    92       5  10 40 {+b,+a}
    93       6  10 41 {+b,+a}
    94       7  27 24 {+b,+a}
    95       8  27 49 {+b,+a}
    96       11 10 24 {+b DESC,+a}
    97       12 10 25 {+b DESC,+a}
    98       13 10 26 {+b DESC,+a}
    99       14 10 39 {+b DESC,+a}
   100       15 10 40 {+b DESC,+a}
   101       16 10 41 {+b DESC,+a}
   102       17 27 24 {+b DESC,+a}
   103       18 27 49 {+b DESC,+a}
   104       21 10 24 {+b,+a DESC}
   105       22 10 25 {+b,+a DESC}
   106       23 10 26 {+b,+a DESC}
   107       24 10 39 {+b,+a DESC}
   108       25 10 40 {+b,+a DESC}
   109       26 10 41 {+b,+a DESC}
   110       27 27 24 {+b,+a DESC}
   111       28 27 49 {+b,+a DESC}
   112       31 10 24 {+b DESC,+a DESC}
   113       32 10 25 {+b DESC,+a DESC}
   114       33 10 26 {+b DESC,+a DESC}
   115       34 10 39 {+b DESC,+a DESC}
   116       35 10 40 {+b DESC,+a DESC}
   117       36 10 41 {+b DESC,+a DESC}
   118       37 27 24 {+b DESC,+a DESC}
   119       38 27 49 {+b DESC,+a DESC}
   120    } {
   121      set sql1 "SELECT a FROM t1 ORDER BY $orderby LIMIT $limit OFFSET $offset;"
   122      set sql2 [string map {+ {}} $sql1]
   123      # puts $sql2\n$sql1\n[db eval $sql2]
   124      do_test $tn.21.$tx {db eval $::sql2} [db eval $sql1]
   125    }
   126  
   127    ########################################################################
   128    # A second test table, t2, has many columns open to sorting.
   129    do_test $tn.31 {
   130      db eval "CREATE TABLE t2(a,b,c,d,e,f,PRIMARY KEY(b,c,d,e,f)) $rowidclause;"
   131      db eval {
   132        WITH RECURSIVE
   133         cnt(x) AS (VALUES(0) UNION ALL SELECT x+1 FROM cnt WHERE x<242)
   134       INSERT INTO t2 SELECT x,  x%3, (x/3)%3, (x/9)%3, (x/27)%3, (x/81)%3
   135                        FROM cnt;
   136      }
   137    } {}
   138  
   139    do_execsql_test $tn.32 {
   140      SELECT a FROM t2 ORDER BY b,c,d,e,f;
   141    } [db eval {SELECT a FROM t2 ORDER BY +b,+c,+d,+e,+f;}]
   142    do_execsql_test $tn.33 {
   143      SELECT a FROM t2 ORDER BY b,c,d,e,+f;
   144    } [db eval {SELECT a FROM t2 ORDER BY +b,+c,+d,+e,+f;}]
   145    do_execsql_test $tn.34 {
   146      SELECT a FROM t2 ORDER BY b,c,d,+e,+f;
   147    } [db eval {SELECT a FROM t2 ORDER BY +b,+c,+d,+e,+f;}]
   148    do_execsql_test $tn.35 {
   149      SELECT a FROM t2 ORDER BY b,c,+d,+e,+f;
   150    } [db eval {SELECT a FROM t2 ORDER BY +b,+c,+d,+e,+f;}]
   151    do_execsql_test $tn.36 {
   152      SELECT a FROM t2 ORDER BY b,+c,+d,+e,+f;
   153    } [db eval {SELECT a FROM t2 ORDER BY +b,+c,+d,+e,+f;}]
   154  
   155    do_execsql_test $tn.37 {
   156      SELECT a FROM t2 ORDER BY b,c,d,e,f DESC;
   157    } [db eval {SELECT a FROM t2 ORDER BY +b,+c,+d,+e,+f DESC;}]
   158    do_execsql_test $tn.38 {
   159      SELECT a FROM t2 ORDER BY b,c,d,e DESC,f;
   160    } [db eval {SELECT a FROM t2 ORDER BY +b,+c,+d,+e DESC,+f;}]
   161    do_execsql_test $tn.39 {
   162      SELECT a FROM t2 ORDER BY b,c,d DESC,e,f;
   163    } [db eval {SELECT a FROM t2 ORDER BY +b,+c,+d DESC,+e,+f;}]
   164    do_execsql_test $tn.40 {
   165      SELECT a FROM t2 ORDER BY b,c DESC,d,e,f;
   166    } [db eval {SELECT a FROM t2 ORDER BY +b,+c DESC,+d,+e,+f;}]
   167    do_execsql_test $tn.41 {
   168      SELECT a FROM t2 ORDER BY b DESC,c,d,e,f;
   169    } [db eval {SELECT a FROM t2 ORDER BY +b DESC,+c,+d,+e,+f;}]
   170  
   171    do_execsql_test $tn.42 {
   172      SELECT a FROM t2 ORDER BY b DESC,c DESC,d,e,f LIMIT 31;
   173    } [db eval {SELECT a FROM t2 ORDER BY +b DESC,+c DESC,+d,+e,+f LIMIT 31}]
   174    do_execsql_test $tn.43 {
   175      SELECT a FROM t2 ORDER BY b,c,d,e,f DESC LIMIT 8 OFFSET 7;
   176    } [db eval {SELECT a FROM t2 ORDER BY +b,+c,+d,+e,+f DESC LIMIT 8 OFFSET 7}]
   177  
   178  
   179  }
   180  
   181  
   182  
   183  finish_test