/ Hex Artifact Content
Login

Artifact 277350a26264495e86b1785f34d2d0c8600e021c:


0000: 23 20 32 30 30 38 20 41 70 72 69 6c 20 31 0a 23  # 2008 April 1.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you 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 2a 2a 0a 23 0a 23 20 54 65 73 74 20 63 61  ****.#.# Test ca
0170: 73 65 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20  ses designed to 
0180: 65 78 65 72 63 69 73 65 20 61 6e 64 20 76 65 72  exercise and ver
0190: 69 66 79 20 74 68 65 20 6c 6f 67 69 63 20 66 6f  ify the logic fo
01a0: 72 0a 23 20 66 61 63 74 6f 72 69 6e 67 20 63 6f  r.# factoring co
01b0: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
01c0: 6e 73 20 6f 75 74 20 6f 66 20 6c 6f 6f 70 73 20  ns out of loops 
01d0: 61 6e 64 20 66 6f 72 0a 23 20 63 6f 6d 6d 6f 6e  and for.# common
01e0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 65   subexpression e
01f0: 6c 69 6d 69 6e 61 74 69 6f 6e 73 2e 0a 23 0a 23  liminations..#.#
0200: 20 24 49 64 3a 20 63 73 65 2e 74 65 73 74 2c 76   $Id: cse.test,v
0210: 20 31 2e 36 20 32 30 30 38 2f 30 38 2f 30 34 20   1.6 2008/08/04 
0220: 30 33 3a 35 31 3a 32 34 20 64 61 6e 69 65 6c 6b  03:51:24 danielk
0230: 31 39 37 37 20 45 78 70 20 24 0a 23 0a 0a 73 65  1977 Exp $.#..se
0240: 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20  t testdir [file 
0250: 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a  dirname $argv0].
0260: 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f  source $testdir/
0270: 74 65 73 74 65 72 2e 74 63 6c 0a 0a 64 6f 5f 74  tester.tcl..do_t
0280: 65 73 74 20 63 73 65 2d 31 2e 31 20 7b 0a 20 20  est cse-1.1 {.  
0290: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
02a0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
02b0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
02c0: 4b 45 59 2c 20 62 2c 20 63 2c 20 64 2c 20 65 2c  KEY, b, c, d, e,
02d0: 20 66 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   f);.    INSERT 
02e0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
02f0: 2c 31 31 2c 31 32 2c 31 33 2c 31 34 2c 31 35 29  ,11,12,13,14,15)
0300: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0310: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 32 31  O t1 VALUES(2,21
0320: 2c 32 32 2c 32 33 2c 32 34 2c 32 35 29 3b 0a 20  ,22,23,24,25);. 
0330: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   }.  execsql {. 
0340: 20 20 20 53 45 4c 45 43 54 20 62 2c 20 2d 62 2c     SELECT b, -b,
0350: 20 7e 62 2c 20 4e 4f 54 20 62 2c 20 4e 4f 54 20   ~b, NOT b, NOT 
0360: 4e 4f 54 20 62 2c 20 62 2d 62 2c 20 62 2b 62 2c  NOT b, b-b, b+b,
0370: 20 62 2a 62 2c 20 62 2f 62 2c 20 62 20 46 52 4f   b*b, b/b, b FRO
0380: 4d 20 74 31 0a 20 20 7d 0a 7d 20 7b 31 31 20 2d  M t1.  }.} {11 -
0390: 31 31 20 2d 31 32 20 30 20 31 20 30 20 32 32 20  11 -12 0 1 0 22 
03a0: 31 32 31 20 31 20 31 31 20 32 31 20 2d 32 31 20  121 1 11 21 -21 
03b0: 2d 32 32 20 30 20 31 20 30 20 34 32 20 34 34 31  -22 0 1 0 42 441
03c0: 20 31 20 32 31 7d 0a 64 6f 5f 74 65 73 74 20 63   1 21}.do_test c
03d0: 73 65 2d 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  se-1.2 {.  execs
03e0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
03f0: 62 2c 20 62 25 62 2c 20 62 3d 3d 62 2c 20 62 21  b, b%b, b==b, b!
0400: 3d 62 2c 20 62 3c 62 2c 20 62 3c 3d 62 2c 20 62  =b, b<b, b<=b, b
0410: 20 49 53 20 4e 55 4c 4c 2c 20 62 20 4e 4f 54 20   IS NULL, b NOT 
0420: 4e 55 4c 4c 2c 20 62 20 46 52 4f 4d 20 74 31 0a  NULL, b FROM t1.
0430: 20 20 7d 0a 7d 20 7b 31 31 20 30 20 31 20 30 20    }.} {11 0 1 0 
0440: 30 20 31 20 30 20 31 20 31 31 20 32 31 20 30 20  0 1 0 1 11 21 0 
0450: 31 20 30 20 30 20 31 20 30 20 31 20 32 31 7d 0a  1 0 0 1 0 1 21}.
0460: 64 6f 5f 74 65 73 74 20 63 73 65 2d 31 2e 33 20  do_test cse-1.3 
0470: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
0480: 20 20 53 45 4c 45 43 54 20 62 2c 20 61 62 73 28    SELECT b, abs(
0490: 62 29 2c 20 63 6f 61 6c 65 73 63 65 28 62 2c 2d  b), coalesce(b,-
04a0: 62 2c 4e 4f 54 20 62 2c 63 2c 4e 4f 54 20 63 29  b,NOT b,c,NOT c)
04b0: 2c 20 63 2c 20 2d 63 20 46 52 4f 4d 20 74 31 3b  , c, -c FROM t1;
04c0: 0a 20 20 7d 0a 7d 20 7b 31 31 20 31 31 20 31 31  .  }.} {11 11 11
04d0: 20 31 32 20 2d 31 32 20 32 31 20 32 31 20 32 31   12 -12 21 21 21
04e0: 20 32 32 20 2d 32 32 7d 0a 64 6f 5f 74 65 73 74   22 -22}.do_test
04f0: 20 63 73 65 2d 31 2e 34 20 7b 0a 20 20 65 78 65   cse-1.4 {.  exe
0500: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
0510: 54 20 43 41 53 45 20 57 48 45 4e 20 61 3d 3d 31  T CASE WHEN a==1
0520: 20 54 48 45 4e 20 62 20 45 4c 53 45 20 63 20 45   THEN b ELSE c E
0530: 4e 44 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31  ND, b, c FROM t1
0540: 0a 20 20 7d 0a 7d 20 7b 31 31 20 31 31 20 31 32  .  }.} {11 11 12
0550: 20 32 32 20 32 31 20 32 32 7d 0a 64 6f 5f 74 65   22 21 22}.do_te
0560: 73 74 20 63 73 65 2d 31 2e 35 20 7b 0a 20 20 65  st cse-1.5 {.  e
0570: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
0580: 45 43 54 20 43 41 53 45 20 61 20 57 48 45 4e 20  ECT CASE a WHEN 
0590: 31 20 54 48 45 4e 20 62 20 57 48 45 4e 20 32 20  1 THEN b WHEN 2 
05a0: 54 48 45 4e 20 63 20 45 4c 53 45 20 64 20 45 4e  THEN c ELSE d EN
05b0: 44 2c 20 62 2c 20 63 2c 20 64 20 46 52 4f 4d 20  D, b, c, d FROM 
05c0: 74 31 0a 20 20 7d 0a 7d 20 7b 31 31 20 31 31 20  t1.  }.} {11 11 
05d0: 31 32 20 31 33 20 32 32 20 32 31 20 32 32 20 32  12 13 22 21 22 2
05e0: 33 7d 0a 64 6f 5f 74 65 73 74 20 63 73 65 2d 31  3}.do_test cse-1
05f0: 2e 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .6.1 {.  execsql
0600: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 43 41   {.    SELECT CA
0610: 53 45 20 62 20 57 48 45 4e 20 31 31 20 54 48 45  SE b WHEN 11 THE
0620: 4e 20 2d 62 20 57 48 45 4e 20 32 31 20 54 48 45  N -b WHEN 21 THE
0630: 4e 20 2d 63 20 45 4c 53 45 20 2d 64 20 45 4e 44  N -c ELSE -d END
0640: 2c 20 62 2c 20 63 2c 20 64 20 46 52 4f 4d 20 74  , b, c, d FROM t
0650: 31 0a 20 20 7d 0a 7d 20 7b 2d 31 31 20 31 31 20  1.  }.} {-11 11 
0660: 31 32 20 31 33 20 2d 32 32 20 32 31 20 32 32 20  12 13 -22 21 22 
0670: 32 33 7d 0a 64 6f 5f 74 65 73 74 20 63 73 65 2d  23}.do_test cse-
0680: 31 2e 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  1.6.2 {.  execsq
0690: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 43  l {.    SELECT C
06a0: 41 53 45 20 62 2b 31 20 57 48 45 4e 20 63 20 54  ASE b+1 WHEN c T
06b0: 48 45 4e 20 64 20 57 48 45 4e 20 65 20 54 48 45  HEN d WHEN e THE
06c0: 4e 20 66 20 45 4c 53 45 20 39 39 39 20 45 4e 44  N f ELSE 999 END
06d0: 2c 20 62 2c 20 63 2c 20 64 20 46 52 4f 4d 20 74  , b, c, d FROM t
06e0: 31 0a 20 20 7d 0a 7d 20 7b 31 33 20 31 31 20 31  1.  }.} {13 11 1
06f0: 32 20 31 33 20 32 33 20 32 31 20 32 32 20 32 33  2 13 23 21 22 23
0700: 7d 0a 64 6f 5f 74 65 73 74 20 63 73 65 2d 31 2e  }.do_test cse-1.
0710: 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.3 {.  execsql 
0720: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 43 41 53  {.    SELECT CAS
0730: 45 20 57 48 45 4e 20 62 20 54 48 45 4e 20 64 20  E WHEN b THEN d 
0740: 57 48 45 4e 20 65 20 54 48 45 4e 20 66 20 45 4c  WHEN e THEN f EL
0750: 53 45 20 39 39 39 20 45 4e 44 2c 20 62 2c 20 63  SE 999 END, b, c
0760: 2c 20 64 20 46 52 4f 4d 20 74 31 0a 20 20 7d 0a  , d FROM t1.  }.
0770: 7d 20 7b 31 33 20 31 31 20 31 32 20 31 33 20 32  } {13 11 12 13 2
0780: 33 20 32 31 20 32 32 20 32 33 7d 0a 64 6f 5f 74  3 21 22 23}.do_t
0790: 65 73 74 20 63 73 65 2d 31 2e 36 2e 34 20 7b 0a  est cse-1.6.4 {.
07a0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
07b0: 53 45 4c 45 43 54 20 62 2c 20 63 2c 20 64 2c 20  SELECT b, c, d, 
07c0: 43 41 53 45 20 57 48 45 4e 20 62 20 54 48 45 4e  CASE WHEN b THEN
07d0: 20 64 20 57 48 45 4e 20 65 20 54 48 45 4e 20 66   d WHEN e THEN f
07e0: 20 45 4c 53 45 20 39 39 39 20 45 4e 44 20 46 52   ELSE 999 END FR
07f0: 4f 4d 20 74 31 0a 20 20 7d 0a 7d 20 7b 31 31 20  OM t1.  }.} {11 
0800: 31 32 20 31 33 20 31 33 20 32 31 20 32 32 20 32  12 13 13 21 22 2
0810: 33 20 32 33 7d 0a 64 6f 5f 74 65 73 74 20 63 73  3 23}.do_test cs
0820: 65 2d 31 2e 36 2e 35 20 7b 0a 20 20 65 78 65 63  e-1.6.5 {.  exec
0830: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
0840: 20 62 2c 20 63 2c 20 64 2c 20 43 41 53 45 20 57   b, c, d, CASE W
0850: 48 45 4e 20 30 20 54 48 45 4e 20 64 20 57 48 45  HEN 0 THEN d WHE
0860: 4e 20 65 20 54 48 45 4e 20 66 20 45 4c 53 45 20  N e THEN f ELSE 
0870: 39 39 39 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a  999 END FROM t1.
0880: 20 20 7d 0a 7d 20 7b 31 31 20 31 32 20 31 33 20    }.} {11 12 13 
0890: 31 35 20 32 31 20 32 32 20 32 33 20 32 35 7d 0a  15 21 22 23 25}.
08a0: 64 6f 5f 74 65 73 74 20 63 73 65 2d 31 2e 37 20  do_test cse-1.7 
08b0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
08c0: 20 20 53 45 4c 45 43 54 20 61 2c 20 2d 61 2c 20    SELECT a, -a, 
08d0: 7e 61 2c 20 4e 4f 54 20 61 2c 20 4e 4f 54 20 4e  ~a, NOT a, NOT N
08e0: 4f 54 20 61 2c 20 61 2d 61 2c 20 61 2b 61 2c 20  OT a, a-a, a+a, 
08f0: 61 2a 61 2c 20 61 2f 61 2c 20 61 20 46 52 4f 4d  a*a, a/a, a FROM
0900: 20 74 31 0a 20 20 7d 0a 7d 20 7b 31 20 2d 31 20   t1.  }.} {1 -1 
0910: 2d 32 20 30 20 31 20 30 20 32 20 31 20 31 20 31  -2 0 1 0 2 1 1 1
0920: 20 32 20 2d 32 20 2d 33 20 30 20 31 20 30 20 34   2 -2 -3 0 1 0 4
0930: 20 34 20 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20   4 1 2}.do_test 
0940: 63 73 65 2d 31 2e 38 20 7b 0a 20 20 65 78 65 63  cse-1.8 {.  exec
0950: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
0960: 20 61 2c 20 61 25 61 2c 20 61 3d 3d 61 2c 20 61   a, a%a, a==a, a
0970: 21 3d 61 2c 20 61 3c 61 2c 20 61 3c 3d 61 2c 20  !=a, a<a, a<=a, 
0980: 61 20 49 53 20 4e 55 4c 4c 2c 20 61 20 4e 4f 54  a IS NULL, a NOT
0990: 20 4e 55 4c 4c 2c 20 61 20 46 52 4f 4d 20 74 31   NULL, a FROM t1
09a0: 0a 20 20 7d 0a 7d 20 7b 31 20 30 20 31 20 30 20  .  }.} {1 0 1 0 
09b0: 30 20 31 20 30 20 31 20 31 20 32 20 30 20 31 20  0 1 0 1 1 2 0 1 
09c0: 30 20 30 20 31 20 30 20 31 20 32 7d 0a 64 6f 5f  0 0 1 0 1 2}.do_
09d0: 74 65 73 74 20 63 73 65 2d 31 2e 39 20 7b 0a 20  test cse-1.9 {. 
09e0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
09f0: 45 4c 45 43 54 20 4e 4f 54 20 62 2c 20 7e 62 2c  ELECT NOT b, ~b,
0a00: 20 4e 4f 54 20 4e 4f 54 20 62 2c 20 62 20 46 52   NOT NOT b, b FR
0a10: 4f 4d 20 74 31 0a 20 20 7d 0a 7d 20 7b 30 20 2d  OM t1.  }.} {0 -
0a20: 31 32 20 31 20 31 31 20 30 20 2d 32 32 20 31 20  12 1 11 0 -22 1 
0a30: 32 31 7d 0a 64 6f 5f 74 65 73 74 20 63 73 65 2d  21}.do_test cse-
0a40: 31 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c  1.10 {.  execsql
0a50: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 43 41   {.    SELECT CA
0a60: 53 54 28 62 20 41 53 20 69 6e 74 65 67 65 72 29  ST(b AS integer)
0a70: 2c 20 74 79 70 65 6f 66 28 62 29 2c 20 43 41 53  , typeof(b), CAS
0a80: 54 28 62 20 41 53 20 74 65 78 74 29 2c 20 74 79  T(b AS text), ty
0a90: 70 65 6f 66 28 62 29 20 46 52 4f 4d 20 74 31 0a  peof(b) FROM t1.
0aa0: 20 20 7d 0a 7d 20 7b 31 31 20 69 6e 74 65 67 65    }.} {11 intege
0ab0: 72 20 31 31 20 69 6e 74 65 67 65 72 20 32 31 20  r 11 integer 21 
0ac0: 69 6e 74 65 67 65 72 20 32 31 20 69 6e 74 65 67  integer 21 integ
0ad0: 65 72 7d 0a 69 66 63 61 70 61 62 6c 65 20 63 6f  er}.ifcapable co
0ae0: 6d 70 6f 75 6e 64 20 7b 0a 20 20 64 6f 5f 74 65  mpound {.  do_te
0af0: 73 74 20 63 73 65 2d 31 2e 31 31 20 7b 20 0a 20  st cse-1.11 { . 
0b00: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
0b10: 20 20 20 53 45 4c 45 43 54 20 2a 2c 2a 20 46 52     SELECT *,* FR
0b20: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 32 0a  OM t1 WHERE a=2.
0b30: 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
0b40: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 2c 2a        SELECT *,*
0b50: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
0b60: 3d 31 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 32 20  =1.    }.  } {2 
0b70: 32 31 20 32 32 20 32 33 20 32 34 20 32 35 20 32  21 22 23 24 25 2
0b80: 20 32 31 20 32 32 20 32 33 20 32 34 20 32 35 20   21 22 23 24 25 
0b90: 31 20 31 31 20 31 32 20 31 33 20 31 34 20 31 35  1 11 12 13 14 15
0ba0: 20 31 20 31 31 20 31 32 20 31 33 20 31 34 20 31   1 11 12 13 14 1
0bb0: 35 7d 0a 20 20 64 6f 5f 74 65 73 74 20 63 73 65  5}.  do_test cse
0bc0: 2d 31 2e 31 32 20 7b 20 0a 20 20 20 20 65 78 65  -1.12 { .    exe
0bd0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
0be0: 45 43 54 20 63 6f 61 6c 65 73 63 65 28 62 2c 63  ECT coalesce(b,c
0bf0: 2c 64 2c 65 29 2c 20 61 2c 20 62 2c 20 63 2c 20  ,d,e), a, b, c, 
0c00: 64 2c 20 65 20 46 52 4f 4d 20 74 31 20 57 48 45  d, e FROM t1 WHE
0c10: 52 45 20 61 3d 32 0a 20 20 20 20 20 20 55 4e 49  RE a=2.      UNI
0c20: 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 53 45 4c  ON ALL.      SEL
0c30: 45 43 54 20 63 6f 61 6c 65 73 63 65 28 65 2c 64  ECT coalesce(e,d
0c40: 2c 63 2c 62 29 2c 20 65 2c 20 64 2c 20 63 2c 20  ,c,b), e, d, c, 
0c50: 62 2c 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  b, a FROM t1 WHE
0c60: 52 45 20 61 3d 31 0a 20 20 20 20 7d 0a 20 20 7d  RE a=1.    }.  }
0c70: 20 7b 32 31 20 32 20 32 31 20 32 32 20 32 33 20   {21 2 21 22 23 
0c80: 32 34 20 31 34 20 31 34 20 31 33 20 31 32 20 31  24 14 14 13 12 1
0c90: 31 20 31 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 63  1 1}.}.do_test c
0ca0: 73 65 2d 31 2e 31 33 20 7b 0a 20 20 65 78 65 63  se-1.13 {.  exec
0cb0: 73 71 6c 20 7b 0a 20 20 20 20 20 53 45 4c 45 43  sql {.     SELEC
0cc0: 54 20 75 70 70 65 72 28 62 29 2c 20 74 79 70 65  T upper(b), type
0cd0: 6f 66 28 62 29 2c 20 62 20 46 52 4f 4d 20 74 31  of(b), b FROM t1
0ce0: 0a 20 20 7d 0a 7d 20 7b 31 31 20 69 6e 74 65 67  .  }.} {11 integ
0cf0: 65 72 20 31 31 20 32 31 20 69 6e 74 65 67 65 72  er 11 21 integer
0d00: 20 32 31 7d 0a 64 6f 5f 74 65 73 74 20 63 73 65   21}.do_test cse
0d10: 2d 31 2e 31 34 20 7b 0a 20 20 65 78 65 63 73 71  -1.14 {.  execsq
0d20: 6c 20 7b 0a 20 20 20 20 20 53 45 4c 45 43 54 20  l {.     SELECT 
0d30: 62 2c 20 74 79 70 65 6f 66 28 62 29 2c 20 75 70  b, typeof(b), up
0d40: 70 65 72 28 62 29 2c 20 74 79 70 65 6f 66 28 62  per(b), typeof(b
0d50: 29 2c 20 62 20 46 52 4f 4d 20 74 31 0a 20 20 7d  ), b FROM t1.  }
0d60: 0a 7d 20 7b 31 31 20 69 6e 74 65 67 65 72 20 31  .} {11 integer 1
0d70: 31 20 69 6e 74 65 67 65 72 20 31 31 20 32 31 20  1 integer 11 21 
0d80: 69 6e 74 65 67 65 72 20 32 31 20 69 6e 74 65 67  integer 21 integ
0d90: 65 72 20 32 31 7d 0a 0a 23 20 4f 76 65 72 66 6c  er 21}..# Overfl
0da0: 6f 77 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ow the column ca
0db0: 63 68 65 2e 20 20 43 72 65 61 74 65 20 71 75 65  che.  Create que
0dc0: 72 69 65 73 20 69 6e 76 6f 6c 76 69 6e 67 20 6d  ries involving m
0dd0: 6f 72 65 20 61 6e 64 20 6d 6f 72 65 0a 23 20 63  ore and more.# c
0de0: 6f 6c 75 6d 6e 73 20 75 6e 74 69 6c 20 74 68 65  olumns until the
0df0: 20 63 61 63 68 65 20 6f 76 65 72 66 6c 6f 77 73   cache overflows
0e00: 2e 20 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  .  Verify correc
0e10: 74 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 72 6f  t operation thro
0e20: 75 67 68 6f 75 74 2e 0a 23 0a 64 6f 5f 74 65 73  ughout..#.do_tes
0e30: 74 20 63 73 65 2d 32 2e 31 20 7b 0a 20 20 65 78  t cse-2.1 {.  ex
0e40: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
0e50: 54 45 20 54 41 42 4c 45 20 74 32 28 61 30 2c 61  TE TABLE t2(a0,a
0e60: 31 2c 61 32 2c 61 33 2c 61 34 2c 61 35 2c 61 36  1,a2,a3,a4,a5,a6
0e70: 2c 61 37 2c 61 38 2c 61 39 2c 0a 20 20 20 20 20  ,a7,a8,a9,.     
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0e90: 31 30 2c 61 31 31 2c 61 31 32 2c 61 31 33 2c 61  10,a11,a12,a13,a
0ea0: 31 34 2c 61 31 35 2c 61 31 36 2c 61 31 37 2c 61  14,a15,a16,a17,a
0eb0: 31 38 2c 61 31 39 2c 0a 20 20 20 20 20 20 20 20  18,a19,.        
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 61 32 30 2c              a20,
0ed0: 61 32 31 2c 61 32 32 2c 61 32 33 2c 61 32 34 2c  a21,a22,a23,a24,
0ee0: 61 32 35 2c 61 32 36 2c 61 32 37 2c 61 32 38 2c  a25,a26,a27,a28,
0ef0: 61 32 39 2c 0a 20 20 20 20 20 20 20 20 20 20 20  a29,.           
0f00: 20 20 20 20 20 20 20 20 20 61 33 30 2c 61 33 31           a30,a31
0f10: 2c 61 33 32 2c 61 33 33 2c 61 33 34 2c 61 33 35  ,a32,a33,a34,a35
0f20: 2c 61 33 36 2c 61 33 37 2c 61 33 38 2c 61 33 39  ,a36,a37,a38,a39
0f30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0f40: 20 20 20 20 20 20 61 34 30 2c 61 34 31 2c 61 34        a40,a41,a4
0f50: 32 2c 61 34 33 2c 61 34 34 2c 61 34 35 2c 61 34  2,a43,a44,a45,a4
0f60: 36 2c 61 34 37 2c 61 34 38 2c 61 34 39 29 3b 0a  6,a47,a48,a49);.
0f70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0f80: 74 32 20 56 41 4c 55 45 53 28 30 2c 31 2c 32 2c  t2 VALUES(0,1,2,
0f90: 33 2c 34 2c 35 2c 36 2c 37 2c 38 2c 39 2c 0a 20  3,4,5,6,7,8,9,. 
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 20 20 31 30 2c 31 31 2c 31 32 2c 31 33 2c 31     10,11,12,13,1
0fc0: 34 2c 31 35 2c 31 36 2c 31 37 2c 31 38 2c 31 39  4,15,16,17,18,19
0fd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0fe0: 20 20 20 20 20 20 32 30 2c 32 31 2c 32 32 2c 32        20,21,22,2
0ff0: 33 2c 32 34 2c 32 35 2c 32 36 2c 32 37 2c 32 38  3,24,25,26,27,28
1000: 2c 32 39 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,29,.           
1010: 20 20 20 20 20 20 20 20 20 33 30 2c 33 31 2c 33           30,31,3
1020: 32 2c 33 33 2c 33 34 2c 33 35 2c 33 36 2c 33 37  2,33,34,35,36,37
1030: 2c 33 38 2c 33 39 2c 0a 20 20 20 20 20 20 20 20  ,38,39,.        
1040: 20 20 20 20 20 20 20 20 20 20 20 20 34 30 2c 34              40,4
1050: 31 2c 34 32 2c 34 33 2c 34 34 2c 34 35 2c 34 36  1,42,43,44,45,46
1060: 2c 34 37 2c 34 38 2c 34 39 29 3b 0a 20 20 20 20  ,47,48,49);.    
1070: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
1080: 3b 0a 20 20 7d 0a 7d 20 7b 30 20 31 20 32 20 33  ;.  }.} {0 1 2 3
1090: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20   4 5 6 7 8 9 10 
10a0: 31 31 20 31 32 20 31 33 20 31 34 20 31 35 20 31  11 12 13 14 15 1
10b0: 36 20 31 37 20 31 38 20 31 39 20 32 30 20 32 31  6 17 18 19 20 21
10c0: 20 32 32 20 32 33 20 32 34 20 32 35 20 32 36 20   22 23 24 25 26 
10d0: 32 37 20 32 38 20 32 39 20 33 30 20 33 31 20 33  27 28 29 30 31 3
10e0: 32 20 33 33 20 33 34 20 33 35 20 33 36 20 33 37  2 33 34 35 36 37
10f0: 20 33 38 20 33 39 20 34 30 20 34 31 20 34 32 20   38 39 40 41 42 
1100: 34 33 20 34 34 20 34 35 20 34 36 20 34 37 20 34  43 44 45 46 47 4
1110: 38 20 34 39 7d 0a 0a 66 6f 72 20 7b 73 65 74 20  8 49}..for {set 
1120: 69 20 31 7d 20 7b 24 69 3c 31 30 30 7d 20 7b 69  i 1} {$i<100} {i
1130: 6e 63 72 20 69 7d 20 7b 0a 20 20 73 65 74 20 6e  ncr i} {.  set n
1140: 20 5b 65 78 70 72 20 7b 69 6e 74 28 72 61 6e 64   [expr {int(rand
1150: 28 29 2a 34 34 29 2b 35 7d 5d 0a 20 20 73 65 74  ()*44)+5}].  set
1160: 20 63 6f 6c 73 65 74 20 7b 7d 0a 20 20 73 65 74   colset {}.  set
1170: 20 61 6e 73 77 65 72 20 7b 7d 0a 20 20 66 6f 72   answer {}.  for
1180: 20 7b 73 65 74 20 6a 20 30 7d 20 7b 24 6a 3c 24   {set j 0} {$j<$
1190: 6e 7d 20 7b 69 6e 63 72 20 6a 7d 20 7b 0a 20 20  n} {incr j} {.  
11a0: 20 20 73 65 74 20 72 20 5b 65 78 70 72 20 7b 24    set r [expr {$
11b0: 6a 2b 69 6e 74 28 72 61 6e 64 28 29 2a 35 29 7d  j+int(rand()*5)}
11c0: 5d 0a 20 20 20 20 69 66 20 7b 24 72 3e 34 39 7d  ].    if {$r>49}
11d0: 20 7b 73 65 74 20 72 20 5b 65 78 70 72 20 7b 39   {set r [expr {9
11e0: 39 2d 24 72 7d 5d 7d 0a 20 20 20 20 6c 61 70 70  9-$r}]}.    lapp
11f0: 65 6e 64 20 63 6f 6c 73 65 74 20 61 24 6a 20 61  end colset a$j a
1200: 24 72 20 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  $r .    lappend 
1210: 61 6e 73 77 65 72 20 24 6a 20 24 72 0a 20 20 7d  answer $j $r.  }
1220: 0a 20 20 73 65 74 20 73 71 6c 20 22 53 45 4c 45  .  set sql "SELE
1230: 43 54 20 5b 6a 6f 69 6e 20 24 63 6f 6c 73 65 74  CT [join $colset
1240: 20 2c 5d 20 46 52 4f 4d 20 74 32 22 0a 20 20 64   ,] FROM t2".  d
1250: 6f 5f 74 65 73 74 20 63 73 65 2d 32 2e 32 2e 24  o_test cse-2.2.$
1260: 69 20 7b 0a 20 20 20 20 23 20 65 78 70 6c 61 69  i {.    # explai
1270: 6e 20 24 3a 3a 73 71 6c 0a 20 20 20 20 65 78 65  n $::sql.    exe
1280: 63 73 71 6c 20 24 3a 3a 73 71 6c 0a 20 20 7d 20  csql $::sql.  } 
1290: 24 61 6e 73 77 65 72 0a 7d 0a 0a 66 69 6e 69 73  $answer.}..finis
12a0: 68 5f 74 65 73 74 0a                             h_test.