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

     1  # 2018 May 8
     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  
    14  set testdir [file dirname $argv0]
    15  source $testdir/tester.tcl
    16  set testprefix windowfault
    17  
    18  ifcapable !windowfunc {
    19    finish_test
    20    return
    21  }
    22  
    23  do_execsql_test 1.0 {
    24    CREATE TABLE t1(a, b, c, d);
    25    INSERT INTO t1 VALUES(1, 2, 3, 4);
    26    INSERT INTO t1 VALUES(5, 6, 7, 8);
    27    INSERT INTO t1 VALUES(9, 10, 11, 12);
    28  }
    29  faultsim_save_and_close
    30  
    31  do_faultsim_test 1 -start 1 -faults oom-t* -prep {
    32    faultsim_restore_and_reopen
    33  } -body {
    34    execsql {
    35      SELECT row_number() OVER win,
    36             rank() OVER win,
    37             dense_rank() OVER win,
    38             ntile(2) OVER win,
    39             first_value(d) OVER win,
    40             last_value(d) OVER win,
    41             nth_value(d,2) OVER win,
    42             lead(d) OVER win,
    43             lag(d) OVER win,
    44             max(d) OVER win,
    45             min(d) OVER win
    46      FROM t1
    47      WINDOW win AS (ORDER BY a)
    48    }
    49  } -test {
    50    faultsim_test_result {0 {1 1 1 1 4 4 {} 8 {} 4 4 2 2 2 1 4 8 8 12 4 8 4 3 3 3 2 4 12 8 {} 8 12 4}}
    51  }
    52  
    53  do_faultsim_test 1.1 -faults oom-t* -prep {
    54    faultsim_restore_and_reopen
    55  } -body {
    56    execsql {
    57      SELECT row_number() OVER win,
    58             rank() OVER win,
    59             dense_rank() OVER win
    60      FROM t1
    61      WINDOW win AS (PARTITION BY c<7 ORDER BY a)
    62    }
    63  } -test {
    64    faultsim_test_result {0 {1 1 1 2 2 2 1 1 1}}
    65  }
    66  
    67  do_faultsim_test 1.2 -faults oom-t* -prep {
    68    faultsim_restore_and_reopen
    69  } -body {
    70    execsql {
    71      SELECT ntile(105) 
    72      OVER ( RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) 
    73      FROM t1
    74    }
    75  } -test {
    76    faultsim_test_result {0 {1 2 3}}
    77  }
    78  
    79  do_faultsim_test 2 -start 1 -faults oom-* -prep {
    80    faultsim_restore_and_reopen
    81  } -body {
    82    execsql {
    83      SELECT round(percent_rank() OVER win, 2),
    84             round(cume_dist() OVER win, 2)
    85      FROM t1
    86      WINDOW win AS (ORDER BY a)
    87    }
    88  } -test {
    89    faultsim_test_result {0 {0.0 0.33 0.5 0.67 1.0 1.0}}
    90  }
    91  
    92  do_faultsim_test 3 -faults oom-* -prep {
    93    faultsim_restore_and_reopen
    94  } -body {
    95    execsql {
    96      SELECT min(d) OVER win, max(d) OVER win
    97      FROM t1
    98      WINDOW win AS (ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
    99    }
   100  } -test {
   101    faultsim_test_result {0 {4 12 8 12 12 12}}
   102  }
   103  
   104  do_faultsim_test 4 -faults oom-* -prep {
   105    faultsim_restore_and_reopen
   106  } -body {
   107    execsql {
   108      CREATE VIEW aaa AS
   109      SELECT min(d) OVER w, max(d) OVER w
   110      FROM t1
   111      WINDOW w AS (ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING);
   112      SELECT * FROM aaa;
   113    }
   114  } -test {
   115    faultsim_test_result {0 {4 12 8 12 12 12}}
   116  }
   117  
   118  do_faultsim_test 5 -start 1 -faults oom-* -prep {
   119    faultsim_restore_and_reopen
   120  } -body {
   121    execsql {
   122      SELECT last_value(a) OVER win1,
   123             last_value(a) OVER win2
   124      FROM t1
   125      WINDOW win1 AS (ORDER BY a ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING),
   126             win2 AS (ORDER BY a)
   127    }
   128  } -test {
   129    faultsim_test_result {0 {5 1 9 5 9 9}}
   130  }
   131  
   132  do_faultsim_test 6 -faults oom-* -prep {
   133    faultsim_restore_and_reopen
   134  } -body {
   135    execsql {
   136      SELECT percent_rank() OVER (), cume_dist() OVER () FROM t1
   137    }
   138  } -test {
   139    faultsim_test_result {0 {0.0 1.0 0.0 1.0 0.0 1.0}}
   140  }
   141  
   142  do_faultsim_test 7 -faults oom-* -prep {
   143    faultsim_restore_and_reopen
   144  } -body {
   145    execsql {
   146      SELECT percent_rank() OVER (), cume_dist() OVER () FROM t1
   147    }
   148  } -test {
   149    faultsim_test_result {0 {0.0 1.0 0.0 1.0 0.0 1.0}}
   150  }
   151  
   152  do_faultsim_test 8 -faults oom-t* -prep {
   153    faultsim_restore_and_reopen
   154  } -body {
   155    execsql {
   156      SELECT a, sum(b) OVER win1 FROM t1
   157        WINDOW win1 AS (PARTITION BY a ),
   158               win2 AS (PARTITION BY b )
   159      ORDER BY a;
   160    }
   161  } -test {
   162    faultsim_test_result {0 {1 2 5 6 9 10}}
   163  }
   164  
   165  #-------------------------------------------------------------------------
   166  # The following test causes a cursor in REQURESEEK state to be passed
   167  # to sqlite3BtreeDelete(). An error is simulated within the seek operation
   168  # to restore the cursors position.
   169  #
   170  reset_db
   171  set big [string repeat x 900]
   172  do_execsql_test 9.0 {
   173    PRAGMA page_size = 512;
   174    PRAGMA cache_size = 2;
   175    CREATE TABLE t(x INTEGER PRIMARY KEY, y TEXT);
   176    WITH s(i) AS (
   177      VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<1900
   178    )
   179    INSERT INTO t(y) SELECT $big FROM s;
   180  }
   181  db close
   182  
   183  testvfs tvfs -default 1
   184  tvfs script vfs_callback
   185  tvfs filter xRead
   186  
   187  sqlite3 db test.db
   188  proc vfs_callback {method file args} {
   189    if {$file=="" && [info exists ::tmp_read_fail]} {
   190      incr ::tmp_read_fail -1
   191      if {$::tmp_read_fail<=0} {
   192        return "SQLITE_IOERR"
   193      }
   194    }
   195    return "SQLITE_OK"
   196  }
   197  
   198  set FAULTSIM(tmpread) [list                \
   199    -injectstart   tmpread_injectstart       \
   200    -injectstop    tmpread_injectstop        \
   201    -injecterrlist {{1 {disk I/O error}}}    \
   202  ]
   203  proc tmpread_injectstart {iFail} {
   204    set ::tmp_read_fail $iFail
   205  }
   206  proc tmpread_injectstop {} {
   207    set ret [expr $::tmp_read_fail<=0]
   208    unset -nocomplain ::tmp_read_fail 
   209    return $ret
   210  }
   211  
   212  set L [db eval {SELECT 0.0 FROM t}]
   213  do_faultsim_test 9 -end 25 -faults tmpread -body {
   214    execsql {
   215      SELECT sum(y) OVER win FROM t
   216      WINDOW win AS (
   217        ORDER BY x ROWS BETWEEN UNBOUNDED PRECEDING AND 1800 FOLLOWING
   218      )
   219    }
   220  } -test {
   221    faultsim_test_result [list 0 $::L]
   222  }
   223  
   224  catch {db close}
   225  tvfs delete
   226  
   227  reset_db
   228  do_execsql_test 10.0 {
   229    CREATE TABLE t1(a, b, c, d);
   230    CREATE TABLE t2(a, b, c, d);
   231  }
   232  
   233  do_faultsim_test 10 -faults oom* -prep {
   234  } -body {
   235    execsql {
   236      SELECT row_number() OVER win
   237      FROM t1
   238      WINDOW win AS (
   239        ORDER BY (
   240          SELECT percent_rank() OVER win2 FROM t2
   241          WINDOW win2 AS (ORDER BY a)
   242        )
   243      )
   244    }
   245  } -test {
   246    faultsim_test_result {0 {}}
   247  }
   248  
   249  #-------------------------------------------------------------------------
   250  reset_db
   251  do_execsql_test 11.0 {
   252    DROP TABLE IF EXISTS t0;
   253    CREATE TABLE t0(c0 INTEGER UNIQUE);
   254    INSERT INTO t0 VALUES(0);
   255  } {}
   256  
   257  do_faultsim_test 11.1 -faults oom* -prep {
   258  } -body {
   259    execsql {
   260      SELECT * FROM t0 WHERE 
   261        (0, t0.c0) IN (SELECT DENSE_RANK() OVER(), LAG(0) OVER() FROM t0);
   262    }
   263  } -test {
   264    faultsim_test_result {0 {}}
   265  }
   266  
   267  do_faultsim_test 11.2 -faults oom* -prep {
   268  } -body {
   269    execsql {
   270      VALUES(false),(current_date collate binary) 
   271      intersect 
   272      values(count() not like group_concat(cast(cast(0e00 as text) as integer) <= NULL || 0.4e-0 || 0x8 & true ) over () collate rtrim);
   273    }
   274  } -test {
   275    faultsim_test_result {0 {}}
   276  }
   277  
   278  #-------------------------------------------------------------------------
   279  reset_db
   280  do_execsql_test 12.0 {
   281    CREATE TABLE t1(a, b, c);
   282  } {}
   283  do_faultsim_test 12 -faults oom* -prep {
   284  } -body {
   285    execsql {
   286      WITH v(a, b, row_number) AS (
   287        SELECT a, b, row_number() OVER (PARTITION BY a COLLATE nocase ORDER BY b) FROM t1
   288      )
   289      SELECT * FROM v WHERE a=2
   290    }
   291  } -test {
   292    faultsim_test_result {0 {}}
   293  }
   294  
   295  #-------------------------------------------------------------------------
   296  reset_db
   297  do_execsql_test 13.0 {
   298    CREATE TABLE t1(id INTEGER PRIMARY KEY, a, b);
   299    INSERT INTO t1 VALUES(1, '1', 'a');
   300    INSERT INTO t1 VALUES(2, '22', 'b');
   301    INSERT INTO t1 VALUES(3, '333', 'c');
   302    INSERT INTO t1 VALUES(4, '4444', 'dddd');
   303    INSERT INTO t1 VALUES(5, '55555', 'e');
   304    INSERT INTO t1 VALUES(6, '666666', 'f');
   305    INSERT INTO t1 VALUES(7, '7777777', 'gggggggggg');
   306  } {}
   307  
   308  set queryres [list {*}{
   309    1b22
   310    1b22c333
   311    22c333dddd4444 
   312    333dddd4444e55555 
   313    4444e55555f666666
   314    55555f666666gggggggggg7777777 
   315    666666gggggggggg7777777
   316  }]
   317  do_execsql_test 13.1 {
   318    SELECT group_concat(a, b) OVER (
   319      ORDER BY id RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING
   320    ) FROM t1
   321  } $queryres
   322  
   323  do_faultsim_test 13 -faults oom* -prep {
   324  } -body {
   325    execsql {
   326      SELECT group_concat(a, b) OVER (
   327          ORDER BY id RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING
   328      ) FROM t1
   329    }
   330  } -test {
   331    faultsim_test_result [list 0 $::queryres]
   332  }
   333  
   334  finish_test