/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652821e:


0000: 23 20 32 30 31 38 20 4d 61 79 20 38 0a 23 0a 23  # 2018 May 8.#.#
0010: 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
0020: 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
0030: 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
0040: 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
0050: 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  f.# a legal noti
0060: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
0070: 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 4d  essing:.#.#    M
0080: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
0090: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 20  nd not evil..#  
00a0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00b0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00c0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00d0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 20  ive others..#   
00e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
00f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0100: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0110: 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  u 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 0a 23 20 54 68 69 73 20 66 69 6c 65 20 69  **.# This file i
0170: 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72 65 73  mplements regres
0180: 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72 20 53  sion tests for S
0190: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20 53  QLite library. S
01a0: 70 65 63 69 66 69 63 61 6c 6c 79 2c 0a 23 20 69  pecifically,.# i
01b0: 74 20 74 65 73 74 73 20 74 68 65 20 73 71 6c 69  t tests the sqli
01c0: 74 65 33 5f 63 72 65 61 74 65 5f 77 69 6e 64 6f  te3_create_windo
01d0: 77 5f 66 75 6e 63 74 69 6f 6e 28 29 20 41 50 49  w_function() API
01e0: 2e 0a 23 0a 0a 73 65 74 20 74 65 73 74 64 69 72  ..#..set testdir
01f0: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
0200: 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74  argv0].source $t
0210: 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63  estdir/tester.tc
0220: 6c 0a 73 65 74 20 74 65 73 74 70 72 65 66 69 78  l.set testprefix
0230: 20 77 69 6e 64 6f 77 35 0a 0a 69 66 63 61 70 61   window5..ifcapa
0240: 62 6c 65 20 21 77 69 6e 64 6f 77 66 75 6e 63 20  ble !windowfunc 
0250: 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a  {.  finish_test.
0260: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63    return.}..proc
0270: 20 6d 5f 73 74 65 70 20 7b 63 74 78 20 76 61 6c   m_step {ctx val
0280: 7d 20 7b 0a 20 20 6c 61 70 70 65 6e 64 20 63 74  } {.  lappend ct
0290: 78 20 24 76 61 6c 0a 20 20 72 65 74 75 72 6e 20  x $val.  return 
02a0: 24 63 74 78 0a 7d 0a 70 72 6f 63 20 6d 5f 76 61  $ctx.}.proc m_va
02b0: 6c 75 65 20 7b 63 74 78 7d 20 7b 0a 20 20 73 65  lue {ctx} {.  se
02c0: 74 20 6c 53 6f 72 74 20 5b 6c 73 6f 72 74 20 24  t lSort [lsort $
02d0: 63 74 78 5d 0a 0a 20 20 73 65 74 20 6e 56 61 6c  ctx]..  set nVal
02e0: 20 5b 6c 6c 65 6e 67 74 68 20 24 6c 53 6f 72 74   [llength $lSort
02f0: 5d 0a 20 20 73 65 74 20 6e 20 5b 65 78 70 72 20  ].  set n [expr 
0300: 24 6e 56 61 6c 2f 32 5d 0a 20 20 0a 20 20 69 66  $nVal/2].  .  if
0310: 20 7b 28 24 6e 56 61 6c 20 25 20 32 29 3d 3d 30   {($nVal % 2)==0
0320: 20 26 26 20 24 6e 56 61 6c 3e 30 7d 20 7b 0a 20   && $nVal>0} {. 
0330: 20 20 20 73 65 74 20 61 20 5b 6c 69 6e 64 65 78     set a [lindex
0340: 20 24 6c 53 6f 72 74 20 24 6e 5d 0a 20 20 20 20   $lSort $n].    
0350: 73 65 74 20 62 20 5b 6c 69 6e 64 65 78 20 24 6c  set b [lindex $l
0360: 53 6f 72 74 20 24 6e 2d 31 5d 0a 20 20 20 20 69  Sort $n-1].    i
0370: 66 20 7b 28 24 61 2b 24 62 29 20 25 20 32 7d 20  f {($a+$b) % 2} 
0380: 7b 0a 20 20 20 20 20 20 73 65 74 20 72 65 74 20  {.      set ret 
0390: 5b 65 78 70 72 20 28 24 61 2b 24 62 29 2f 32 2e  [expr ($a+$b)/2.
03a0: 30 5d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  0].    } else {.
03b0: 20 20 20 20 20 20 73 65 74 20 72 65 74 20 5b 65        set ret [e
03c0: 78 70 72 20 28 24 61 2b 24 62 29 2f 32 5d 0a 20  xpr ($a+$b)/2]. 
03d0: 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a     }.  } else {.
03e0: 20 20 20 20 73 65 74 20 72 65 74 20 5b 6c 69 6e      set ret [lin
03f0: 64 65 78 20 24 6c 53 6f 72 74 20 24 6e 5d 0a 20  dex $lSort $n]. 
0400: 20 7d 0a 20 20 72 65 74 75 72 6e 20 24 72 65 74   }.  return $ret
0410: 0a 7d 0a 70 72 6f 63 20 6d 5f 69 6e 76 65 72 73  .}.proc m_invers
0420: 65 20 7b 63 74 78 20 76 61 6c 7d 20 7b 0a 20 20  e {ctx val} {.  
0430: 73 65 74 20 63 74 78 20 5b 6c 72 61 6e 67 65 20  set ctx [lrange 
0440: 24 63 74 78 20 31 20 65 6e 64 5d 0a 20 20 72 65  $ctx 1 end].  re
0450: 74 75 72 6e 20 24 63 74 78 0a 7d 0a 70 72 6f 63  turn $ctx.}.proc
0460: 20 77 5f 76 61 6c 75 65 20 7b 63 74 78 7d 20 7b   w_value {ctx} {
0470: 0a 20 20 6c 73 6f 72 74 20 24 63 74 78 0a 7d 0a  .  lsort $ctx.}.
0480: 0a 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  .sqlite3_create_
0490: 77 69 6e 64 6f 77 5f 66 75 6e 63 74 69 6f 6e 20  window_function 
04a0: 64 62 20 6d 65 64 69 61 6e 20 6d 5f 73 74 65 70  db median m_step
04b0: 20 6d 5f 76 61 6c 75 65 20 6d 5f 76 61 6c 75 65   m_value m_value
04c0: 20 6d 5f 69 6e 76 65 72 73 65 0a 73 71 6c 69 74   m_inverse.sqlit
04d0: 65 33 5f 63 72 65 61 74 65 5f 77 69 6e 64 6f 77  e3_create_window
04e0: 5f 66 75 6e 63 74 69 6f 6e 20 64 62 20 77 69 6e  _function db win
04f0: 20 6d 5f 73 74 65 70 20 77 5f 76 61 6c 75 65 20   m_step w_value 
0500: 77 5f 76 61 6c 75 65 20 6d 5f 69 6e 76 65 72 73  w_value m_invers
0510: 65 0a 0a 64 6f 5f 74 65 73 74 20 30 2e 30 20 7b  e..do_test 0.0 {
0520: 0a 20 20 74 65 73 74 5f 63 72 65 61 74 65 5f 77  .  test_create_w
0530: 69 6e 64 6f 77 5f 66 75 6e 63 74 69 6f 6e 5f 6d  indow_function_m
0540: 69 73 75 73 65 20 64 62 0a 7d 20 7b 7d 0a 0a 64  isuse db.} {}..d
0550: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
0560: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
0570: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
0580: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0590: 41 4c 55 45 53 28 34 2c 20 27 61 27 29 3b 0a 20  ALUES(4, 'a');. 
05a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
05b0: 56 41 4c 55 45 53 28 36 2c 20 27 62 27 29 3b 0a  VALUES(6, 'b');.
05c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
05d0: 20 56 41 4c 55 45 53 28 31 2c 20 27 63 27 29 3b   VALUES(1, 'c');
05e0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
05f0: 31 20 56 41 4c 55 45 53 28 35 2c 20 27 64 27 29  1 VALUES(5, 'd')
0600: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0610: 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27 65 27  t1 VALUES(2, 'e'
0620: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0630: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 27 66   t1 VALUES(3, 'f
0640: 27 29 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  ');.}..do_execsq
0650: 6c 5f 74 65 73 74 20 31 2e 31 20 7b 0a 20 20 53  l_test 1.1 {.  S
0660: 45 4c 45 43 54 20 77 69 6e 28 61 29 20 4f 56 45  ELECT win(a) OVE
0670: 52 20 28 4f 52 44 45 52 20 42 59 20 62 29 2c 20  R (ORDER BY b), 
0680: 6d 65 64 69 61 6e 28 61 29 20 4f 56 45 52 20 28  median(a) OVER (
0690: 4f 52 44 45 52 20 42 59 20 62 29 20 46 52 4f 4d  ORDER BY b) FROM
06a0: 20 74 31 3b 0a 7d 20 7b 34 20 34 20 20 7b 34 20   t1;.} {4 4  {4 
06b0: 36 7d 20 35 20 20 7b 31 20 34 20 36 7d 20 34 20  6} 5  {1 4 6} 4 
06c0: 20 7b 31 20 34 20 35 20 36 7d 20 34 2e 35 20 20   {1 4 5 6} 4.5  
06d0: 7b 31 20 32 20 34 20 35 20 36 7d 20 34 20 7b 31  {1 2 4 5 6} 4 {1
06e0: 20 32 20 33 20 34 20 35 20 36 7d 20 33 2e 35 7d   2 3 4 5 6} 3.5}
06f0: 0a 0a 74 65 73 74 5f 63 72 65 61 74 65 5f 73 75  ..test_create_su
0700: 6d 69 6e 74 20 64 62 0a 64 6f 5f 65 78 65 63 73  mint db.do_execs
0710: 71 6c 5f 74 65 73 74 20 32 2e 30 20 7b 0a 20 20  ql_test 2.0 {.  
0720: 53 45 4c 45 43 54 20 73 75 6d 69 6e 74 28 61 29  SELECT sumint(a)
0730: 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42 59 20   OVER (ORDER BY 
0740: 72 6f 77 69 64 29 20 46 52 4f 4d 20 74 31 20 4f  rowid) FROM t1 O
0750: 52 44 45 52 20 42 59 20 72 6f 77 69 64 3b 0a 7d  RDER BY rowid;.}
0760: 20 7b 34 20 31 30 20 31 31 20 31 36 20 31 38 20   {4 10 11 16 18 
0770: 32 31 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  21}..do_execsql_
0780: 74 65 73 74 20 32 2e 31 20 7b 0a 20 20 53 45 4c  test 2.1 {.  SEL
0790: 45 43 54 20 73 75 6d 69 6e 74 28 61 29 20 4f 56  ECT sumint(a) OV
07a0: 45 52 20 28 4f 52 44 45 52 20 42 59 20 72 6f 77  ER (ORDER BY row
07b0: 69 64 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20  id ROWS BETWEEN 
07c0: 31 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  1 PRECEDING AND 
07d0: 31 20 46 4f 4c 4c 4f 57 49 4e 47 29 20 46 52 4f  1 FOLLOWING) FRO
07e0: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 72 6f  M t1 ORDER BY ro
07f0: 77 69 64 3b 0a 7d 20 7b 31 30 20 31 31 20 31 32  wid;.} {10 11 12
0800: 20 38 20 31 30 20 35 7d 0a 0a 74 65 73 74 5f 6f   8 10 5}..test_o
0810: 76 65 72 72 69 64 65 5f 73 75 6d 20 64 62 0a 64  verride_sum db.d
0820: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
0830: 33 2e 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 73  3.0 {.  SELECT s
0840: 75 6d 28 61 29 20 4f 56 45 52 20 0a 20 20 28 4f  um(a) OVER .  (O
0850: 52 44 45 52 20 42 59 20 62 20 52 4f 57 53 20 42  RDER BY b ROWS B
0860: 45 54 57 45 45 4e 20 31 20 50 52 45 43 45 44 49  ETWEEN 1 PRECEDI
0870: 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52  NG AND CURRENT R
0880: 4f 57 29 20 0a 20 20 46 52 4f 4d 20 74 31 3b 0a  OW) .  FROM t1;.
0890: 7d 20 7b 31 20 7b 73 75 6d 28 29 20 6d 61 79 20  } {1 {sum() may 
08a0: 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73 20 61  not be used as a
08b0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
08c0: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
08d0: 73 74 20 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43  st 3.1 {.  SELEC
08e0: 54 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 31  T sum(a) FROM t1
08f0: 3b 0a 7d 20 7b 32 31 7d 0a 0a 0a 66 69 6e 69 73  ;.} {21}...finis
0900: 68 5f 74 65 73 74 0a                             h_test.