/ Hex Artifact Content
Login

Artifact d5186e2f5478b659f16a2c8b66c09892823e542a:


0000: 23 20 32 30 31 30 20 53 65 70 74 65 6d 62 65 72  # 2010 September
0010: 20 32 31 0a 23 0a 23 20 54 68 65 20 61 75 74 68   21.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67  place of.# a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23  is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
0120: 0a 23 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 2a 2a 2a 2a 2a 0a 23 0a 23 20 54 68  *********.#.# Th
0170: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
0180: 74 73 20 74 65 73 74 73 20 74 6f 20 76 65 72 69  ts tests to veri
0190: 66 79 20 74 68 61 74 20 74 68 65 20 22 74 65 73  fy that the "tes
01a0: 74 61 62 6c 65 20 73 74 61 74 65 6d 65 6e 74 73  table statements
01b0: 22 20 69 6e 20 0a 23 20 74 68 65 20 6c 61 6e 67  " in .# the lang
01c0: 5f 64 65 6c 65 74 65 2e 68 74 6d 6c 20 64 6f 63  _delete.html doc
01d0: 75 6d 65 6e 74 20 61 72 65 20 63 6f 72 72 65 63  ument are correc
01e0: 74 2e 0a 23 0a 73 65 74 20 74 65 73 74 64 69 72  t..#.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 0a 69 66 63 61 70 61 62 6c 65 20 21 63 6f  l..ifcapable !co
0230: 6d 70 6f 75 6e 64 20 7b 0a 20 20 66 69 6e 69 73  mpound {.  finis
0240: 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a  h_test.  return.
0250: 7d 0a 0a 70 72 6f 63 20 64 6f 5f 64 65 6c 65 74  }..proc do_delet
0260: 65 5f 74 65 73 74 73 20 7b 61 72 67 73 7d 20 7b  e_tests {args} {
0270: 0a 20 20 75 70 6c 65 76 65 6c 20 64 6f 5f 73 65  .  uplevel do_se
0280: 6c 65 63 74 5f 74 65 73 74 73 20 24 61 72 67 73  lect_tests $args
0290: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
02a0: 65 73 74 20 65 5f 64 65 6c 65 74 65 2d 30 2e 30  est e_delete-0.0
02b0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
02c0: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 43 52  E t1(a, b);.  CR
02d0: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
02e0: 20 74 31 28 61 29 3b 0a 7d 20 7b 7d 0a 0a 23 20   t1(a);.} {}..# 
02f0: 2d 2d 20 73 79 6e 74 61 78 20 64 69 61 67 72 61  -- syntax diagra
0300: 6d 20 64 65 6c 65 74 65 2d 73 74 6d 74 0a 23 20  m delete-stmt.# 
0310: 2d 2d 20 73 79 6e 74 61 78 20 64 69 61 67 72 61  -- syntax diagra
0320: 6d 20 71 75 61 6c 69 66 69 65 64 2d 74 61 62 6c  m qualified-tabl
0330: 65 2d 6e 61 6d 65 0a 23 0a 64 6f 5f 64 65 6c 65  e-name.#.do_dele
0340: 74 65 5f 74 65 73 74 73 20 65 5f 64 65 6c 65 74  te_tests e_delet
0350: 65 2d 30 2e 31 20 7b 0a 20 20 31 20 20 22 44 45  e-0.1 {.  1  "DE
0360: 4c 45 54 45 20 46 52 4f 4d 20 74 31 22 20 20 20  LETE FROM t1"   
0370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0380: 20 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20             {}.  
0390: 32 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  2  "DELETE FROM 
03a0: 74 31 20 49 4e 44 45 58 45 44 20 42 59 20 69 31  t1 INDEXED BY i1
03b0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
03c0: 20 7b 7d 0a 20 20 33 20 20 22 44 45 4c 45 54 45   {}.  3  "DELETE
03d0: 20 46 52 4f 4d 20 74 31 20 4e 4f 54 20 49 4e 44   FROM t1 NOT IND
03e0: 45 58 45 44 22 20 20 20 20 20 20 20 20 20 20 20  EXED"           
03f0: 20 20 20 20 20 20 20 7b 7d 0a 20 20 34 20 20 22         {}.  4  "
0400: 44 45 4c 45 54 45 20 46 52 4f 4d 20 6d 61 69 6e  DELETE FROM main
0410: 2e 74 31 22 20 20 20 20 20 20 20 20 20 20 20 20  .t1"            
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 7d 0a               {}.
0430: 20 20 35 20 20 22 44 45 4c 45 54 45 20 46 52 4f    5  "DELETE FRO
0440: 4d 20 6d 61 69 6e 2e 74 31 20 49 4e 44 45 58 45  M main.t1 INDEXE
0450: 44 20 42 59 20 69 31 22 20 20 20 20 20 20 20 20  D BY i1"        
0460: 20 20 20 7b 7d 0a 20 20 36 20 20 22 44 45 4c 45     {}.  6  "DELE
0470: 54 45 20 46 52 4f 4d 20 6d 61 69 6e 2e 74 31 20  TE FROM main.t1 
0480: 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 20 20 20  NOT INDEXED"    
0490: 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20 37 20           {}.  7 
04a0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31   "DELETE FROM t1
04b0: 20 57 48 45 52 45 20 61 3e 32 22 20 20 20 20 20   WHERE a>2"     
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
04d0: 7d 0a 20 20 38 20 20 22 44 45 4c 45 54 45 20 46  }.  8  "DELETE F
04e0: 52 4f 4d 20 74 31 20 49 4e 44 45 58 45 44 20 42  ROM t1 INDEXED B
04f0: 59 20 69 31 20 57 48 45 52 45 20 61 3e 32 22 20  Y i1 WHERE a>2" 
0500: 20 20 20 20 20 7b 7d 0a 20 20 39 20 20 22 44 45       {}.  9  "DE
0510: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4e 4f 54  LETE FROM t1 NOT
0520: 20 49 4e 44 45 58 45 44 20 57 48 45 52 45 20 61   INDEXED WHERE a
0530: 3e 32 22 20 20 20 20 20 20 20 20 7b 7d 0a 20 20  >2"        {}.  
0540: 31 30 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  10 "DELETE FROM 
0550: 6d 61 69 6e 2e 74 31 20 57 48 45 52 45 20 61 3e  main.t1 WHERE a>
0560: 32 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2"              
0570: 20 7b 7d 0a 20 20 31 31 20 22 44 45 4c 45 54 45   {}.  11 "DELETE
0580: 20 46 52 4f 4d 20 6d 61 69 6e 2e 74 31 20 49 4e   FROM main.t1 IN
0590: 44 45 58 45 44 20 42 59 20 69 31 20 57 48 45 52  DEXED BY i1 WHER
05a0: 45 20 61 3e 32 22 20 7b 7d 0a 20 20 31 32 20 22  E a>2" {}.  12 "
05b0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 6d 61 69 6e  DELETE FROM main
05c0: 2e 74 31 20 4e 4f 54 20 49 4e 44 45 58 45 44 20  .t1 NOT INDEXED 
05d0: 57 48 45 52 45 20 61 3e 32 22 20 20 20 7b 7d 0a  WHERE a>2"   {}.
05e0: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
05f0: 3a 20 52 2d 32 30 32 30 35 2d 31 37 33 34 39 20  : R-20205-17349 
0600: 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
0610: 75 73 65 20 69 73 20 6e 6f 74 20 70 72 65 73 65  use is not prese
0620: 6e 74 2c 20 61 6c 6c 0a 23 20 72 65 63 6f 72 64  nt, all.# record
0630: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61  s in the table a
0640: 72 65 20 64 65 6c 65 74 65 64 2e 0a 23 0a 64 72  re deleted..#.dr
0650: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
0660: 5f 74 65 73 74 20 65 5f 64 65 6c 65 74 65 2d 31  _test e_delete-1
0670: 2e 30 20 7b 0a 20 20 64 62 20 74 72 61 6e 73 61  .0 {.  db transa
0680: 63 74 69 6f 6e 20 7b 0a 20 20 20 20 66 6f 72 65  ction {.    fore
0690: 61 63 68 20 74 20 7b 74 31 20 74 32 20 74 33 20  ach t {t1 t2 t3 
06a0: 74 34 20 74 35 20 74 36 7d 20 7b 0a 20 20 20 20  t4 t5 t6} {.    
06b0: 20 20 65 78 65 63 73 71 6c 20 5b 73 74 72 69 6e    execsql [strin
06c0: 67 20 6d 61 70 20 5b 6c 69 73 74 20 25 54 25 20  g map [list %T% 
06d0: 24 74 5d 20 7b 0a 20 20 20 20 20 20 20 20 43 52  $t] {.        CR
06e0: 45 41 54 45 20 54 41 42 4c 45 20 25 54 25 28 78  EATE TABLE %T%(x
06f0: 2c 20 79 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  , y);.        IN
0700: 53 45 52 54 20 49 4e 54 4f 20 25 54 25 20 56 41  SERT INTO %T% VA
0710: 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a  LUES(1, 'one');.
0720: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
0730: 4e 54 4f 20 25 54 25 20 56 41 4c 55 45 53 28 32  NTO %T% VALUES(2
0740: 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20 20 20  , 'two');.      
0750: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 54    INSERT INTO %T
0760: 25 20 56 41 4c 55 45 53 28 33 2c 20 27 74 68 72  % VALUES(3, 'thr
0770: 65 65 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  ee');.        IN
0780: 53 45 52 54 20 49 4e 54 4f 20 25 54 25 20 56 41  SERT INTO %T% VA
0790: 4c 55 45 53 28 34 2c 20 27 66 6f 75 72 27 29 3b  LUES(4, 'four');
07a0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
07b0: 49 4e 54 4f 20 25 54 25 20 56 41 4c 55 45 53 28  INTO %T% VALUES(
07c0: 35 2c 20 27 66 69 76 65 27 29 3b 0a 20 20 20 20  5, 'five');.    
07d0: 20 20 7d 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    }].    }.  }.}
07e0: 20 7b 7d 0a 64 6f 5f 64 65 6c 65 74 65 5f 74 65   {}.do_delete_te
07f0: 73 74 73 20 65 5f 64 65 6c 65 74 65 2d 31 2e 31  sts e_delete-1.1
0800: 20 7b 0a 20 20 31 20 20 22 44 45 4c 45 54 45 20   {.  1  "DELETE 
0810: 46 52 4f 4d 20 74 31 20 20 20 20 20 20 20 3b 20  FROM t1       ; 
0820: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0830: 22 20 20 20 20 20 20 20 7b 7d 0a 20 20 32 20 20  "       {}.  2  
0840: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 6d 61 69  "DELETE FROM mai
0850: 6e 2e 74 32 20 20 3b 20 53 45 4c 45 43 54 20 2a  n.t2  ; SELECT *
0860: 20 46 52 4f 4d 20 74 32 22 20 20 20 20 20 20 20   FROM t2"       
0870: 7b 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  {}.}..# EVIDENCE
0880: 2d 4f 46 3a 20 52 2d 33 30 32 30 33 2d 31 36 31  -OF: R-30203-161
0890: 37 37 20 49 66 20 61 20 57 48 45 52 45 20 63 6c  77 If a WHERE cl
08a0: 61 75 73 65 20 69 73 20 73 75 70 70 6c 69 65 64  ause is supplied
08b0: 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 23 20 74 68  , then only.# th
08c0: 6f 73 65 20 72 6f 77 73 20 66 6f 72 20 77 68 69  ose rows for whi
08d0: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ch the result of
08e0: 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20   evaluating the 
08f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 73 20  WHERE clause as 
0900: 61 0a 23 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  a.# boolean expr
0910: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 61  ession is true a
0920: 72 65 20 64 65 6c 65 74 65 64 2e 0a 23 0a 64 6f  re deleted..#.do
0930: 5f 64 65 6c 65 74 65 5f 74 65 73 74 73 20 65 5f  _delete_tests e_
0940: 64 65 6c 65 74 65 2d 31 2e 32 20 7b 0a 20 20 31  delete-1.2 {.  1
0950: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74    "DELETE FROM t
0960: 33 20 57 48 45 52 45 20 31 20 20 20 20 20 20 20  3 WHERE 1       
0970: 3b 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20  ; SELECT x FROM 
0980: 74 33 22 20 20 20 20 20 20 20 7b 7d 0a 20 20 32  t3"       {}.  2
0990: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 6d    "DELETE FROM m
09a0: 61 69 6e 2e 74 34 20 57 48 45 52 45 20 30 20 20  ain.t4 WHERE 0  
09b0: 3b 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20  ; SELECT x FROM 
09c0: 74 34 22 20 20 20 20 20 20 20 7b 31 20 32 20 33  t4"       {1 2 3
09d0: 20 34 20 35 7d 0a 20 20 33 20 20 22 44 45 4c 45   4 5}.  3  "DELE
09e0: 54 45 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45  TE FROM t4 WHERE
09f0: 20 30 2e 30 20 20 20 20 20 3b 20 53 45 4c 45 43   0.0     ; SELEC
0a00: 54 20 78 20 46 52 4f 4d 20 74 34 22 20 20 20 20  T x FROM t4"    
0a10: 20 20 20 7b 31 20 32 20 33 20 34 20 35 7d 0a 20     {1 2 3 4 5}. 
0a20: 20 34 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d   4  "DELETE FROM
0a30: 20 74 34 20 57 48 45 52 45 20 4e 55 4c 4c 20 20   t4 WHERE NULL  
0a40: 20 20 3b 20 53 45 4c 45 43 54 20 78 20 46 52 4f    ; SELECT x FRO
0a50: 4d 20 74 34 22 20 20 20 20 20 20 20 7b 31 20 32  M t4"       {1 2
0a60: 20 33 20 34 20 35 7d 0a 20 20 35 20 20 22 44 45   3 4 5}.  5  "DE
0a70: 4c 45 54 45 20 46 52 4f 4d 20 74 34 20 57 48 45  LETE FROM t4 WHE
0a80: 52 45 20 79 21 3d 27 74 77 6f 27 3b 20 53 45 4c  RE y!='two'; SEL
0a90: 45 43 54 20 78 20 46 52 4f 4d 20 74 34 22 20 20  ECT x FROM t4"  
0aa0: 20 20 20 20 20 7b 32 7d 0a 20 20 36 20 20 22 44       {2}.  6  "D
0ab0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 34 20 57 48  ELETE FROM t4 WH
0ac0: 45 52 45 20 79 3d 27 74 77 6f 27 20 3b 20 53 45  ERE y='two' ; SE
0ad0: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34 22 20  LECT x FROM t4" 
0ae0: 20 20 20 20 20 20 7b 7d 0a 20 20 37 20 20 22 44        {}.  7  "D
0af0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 35 20 57 48  ELETE FROM t5 WH
0b00: 45 52 45 20 78 3d 28 53 45 4c 45 43 54 20 6d 61  ERE x=(SELECT ma
0b10: 78 28 78 29 20 46 52 4f 4d 20 74 35 29 3b 53 45  x(x) FROM t5);SE
0b20: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 35 22 20  LECT x FROM t5" 
0b30: 7b 31 20 32 20 33 20 34 7d 0a 20 20 38 20 20 22  {1 2 3 4}.  8  "
0b40: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 35 20 57  DELETE FROM t5 W
0b50: 48 45 52 45 20 28 53 45 4c 45 43 54 20 6d 61 78  HERE (SELECT max
0b60: 28 78 29 20 46 52 4f 4d 20 74 34 29 20 20 3b 53  (x) FROM t4)  ;S
0b70: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 35 22  ELECT x FROM t5"
0b80: 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 39 20 20   {1 2 3 4}.  9  
0b90: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 35 20  "DELETE FROM t5 
0ba0: 57 48 45 52 45 20 28 53 45 4c 45 43 54 20 6d 61  WHERE (SELECT ma
0bb0: 78 28 78 29 20 46 52 4f 4d 20 74 36 29 20 20 3b  x(x) FROM t6)  ;
0bc0: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 35  SELECT x FROM t5
0bd0: 22 20 7b 7d 0a 20 20 31 30 20 22 44 45 4c 45 54  " {}.  10 "DELET
0be0: 45 20 46 52 4f 4d 20 74 36 20 57 48 45 52 45 20  E FROM t6 WHERE 
0bf0: 79 3e 27 73 65 76 65 6e 27 20 3b 20 53 45 4c 45  y>'seven' ; SELE
0c00: 43 54 20 79 20 46 52 4f 4d 20 74 36 22 20 20 20  CT y FROM t6"   
0c10: 20 20 7b 6f 6e 65 20 66 6f 75 72 20 66 69 76 65    {one four five
0c20: 7d 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}...#---------
0c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c70: 0a 23 20 54 65 73 74 73 20 66 6f 72 20 72 65 73  .# Tests for res
0c80: 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 44 45 4c  trictions on DEL
0c90: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ETE statements t
0ca0: 68 61 74 20 61 70 70 65 61 72 20 77 69 74 68 69  hat appear withi
0cb0: 6e 20 74 72 69 67 67 65 72 0a 23 20 70 72 6f 67  n trigger.# prog
0cc0: 72 61 6d 73 2e 0a 23 0a 66 6f 72 63 65 64 65 6c  rams..#.forcedel
0cd0: 65 74 65 20 74 65 73 74 2e 64 62 32 0a 66 6f 72  ete test.db2.for
0ce0: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
0cf0: 33 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  3.do_execsql_tes
0d00: 74 20 65 5f 64 65 6c 65 74 65 2d 32 2e 30 20 7b  t e_delete-2.0 {
0d10: 0a 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e  .  ATTACH 'test.
0d20: 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20 41  db2' AS aux;.  A
0d30: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 33 27  TTACH 'test.db3'
0d40: 20 41 53 20 61 75 78 32 3b 0a 0a 20 20 43 52 45   AS aux2;..  CRE
0d50: 41 54 45 20 54 41 42 4c 45 20 74 65 6d 70 2e 74  ATE TABLE temp.t
0d60: 37 28 61 2c 20 62 29 3b 20 20 20 49 4e 53 45 52  7(a, b);   INSER
0d70: 54 20 49 4e 54 4f 20 74 65 6d 70 2e 74 37 20 56  T INTO temp.t7 V
0d80: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 43  ALUES(1, 2);.  C
0d90: 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e  REATE TABLE main
0da0: 2e 74 37 28 61 2c 20 62 29 3b 20 20 20 49 4e 53  .t7(a, b);   INS
0db0: 45 52 54 20 49 4e 54 4f 20 6d 61 69 6e 2e 74 37  ERT INTO main.t7
0dc0: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
0dd0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75   CREATE TABLE au
0de0: 78 2e 74 37 28 61 2c 20 62 29 3b 20 20 20 20 49  x.t7(a, b);    I
0df0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 75 78 2e 74  NSERT INTO aux.t
0e00: 37 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a  7 VALUES(5, 6);.
0e10: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
0e20: 75 78 32 2e 74 37 28 61 2c 20 62 29 3b 20 20 20  ux2.t7(a, b);   
0e30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 75 78 32  INSERT INTO aux2
0e40: 2e 74 37 20 56 41 4c 55 45 53 28 37 2c 20 38 29  .t7 VALUES(7, 8)
0e50: 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  ;..  CREATE TABL
0e60: 45 20 6d 61 69 6e 2e 74 38 28 61 2c 20 62 29 3b  E main.t8(a, b);
0e70: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d     INSERT INTO m
0e80: 61 69 6e 2e 74 38 20 56 41 4c 55 45 53 28 31 2c  ain.t8 VALUES(1,
0e90: 20 32 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41   2);.  CREATE TA
0ea0: 42 4c 45 20 61 75 78 2e 74 38 28 61 2c 20 62 29  BLE aux.t8(a, b)
0eb0: 3b 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  ;    INSERT INTO
0ec0: 20 61 75 78 2e 74 38 20 56 41 4c 55 45 53 28 33   aux.t8 VALUES(3
0ed0: 2c 20 34 29 3b 0a 20 20 43 52 45 41 54 45 20 54  , 4);.  CREATE T
0ee0: 41 42 4c 45 20 61 75 78 32 2e 74 38 28 61 2c 20  ABLE aux2.t8(a, 
0ef0: 62 29 3b 20 20 20 49 4e 53 45 52 54 20 49 4e 54  b);   INSERT INT
0f00: 4f 20 61 75 78 32 2e 74 38 20 56 41 4c 55 45 53  O aux2.t8 VALUES
0f10: 28 35 2c 20 36 29 3b 0a 0a 20 20 43 52 45 41 54  (5, 6);..  CREAT
0f20: 45 20 54 41 42 4c 45 20 61 75 78 2e 74 39 28 61  E TABLE aux.t9(a
0f30: 2c 20 62 29 3b 20 20 20 20 49 4e 53 45 52 54 20  , b);    INSERT 
0f40: 49 4e 54 4f 20 61 75 78 2e 74 39 20 56 41 4c 55  INTO aux.t9 VALU
0f50: 45 53 28 31 2c 20 32 29 3b 0a 20 20 43 52 45 41  ES(1, 2);.  CREA
0f60: 54 45 20 54 41 42 4c 45 20 61 75 78 32 2e 74 39  TE TABLE aux2.t9
0f70: 28 61 2c 20 62 29 3b 20 20 20 49 4e 53 45 52 54  (a, b);   INSERT
0f80: 20 49 4e 54 4f 20 61 75 78 32 2e 74 39 20 56 41   INTO aux2.t9 VA
0f90: 4c 55 45 53 28 33 2c 20 34 29 3b 0a 0a 20 20 43  LUES(3, 4);..  C
0fa0: 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 32  REATE TABLE aux2
0fb0: 2e 74 31 30 28 61 2c 20 62 29 3b 20 20 49 4e 53  .t10(a, b);  INS
0fc0: 45 52 54 20 49 4e 54 4f 20 61 75 78 32 2e 74 31  ERT INTO aux2.t1
0fd0: 30 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  0 VALUES(1, 2);.
0fe0: 7d 20 7b 7d 0a 0a 0a 23 20 45 56 49 44 45 4e 43  } {}...# EVIDENC
0ff0: 45 2d 4f 46 3a 20 52 2d 30 39 36 38 31 2d 35 38  E-OF: R-09681-58
1000: 35 36 30 20 54 68 65 20 74 61 62 6c 65 2d 6e 61  560 The table-na
1010: 6d 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20  me specified as 
1020: 70 61 72 74 20 6f 66 20 61 0a 23 20 44 45 4c 45  part of a.# DELE
1030: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  TE statement wit
1040: 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 62 6f  hin a trigger bo
1050: 64 79 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  dy must be unqua
1060: 6c 69 66 69 65 64 2e 0a 23 0a 23 20 45 56 49 44  lified..#.# EVID
1070: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36 37 37 31  ENCE-OF: R-36771
1080: 2d 34 33 37 38 38 20 49 6e 20 6f 74 68 65 72 20  -43788 In other 
1090: 77 6f 72 64 73 2c 20 74 68 65 20 64 61 74 61 62  words, the datab
10a0: 61 73 65 2d 6e 61 6d 65 2e 20 70 72 65 66 69 78  ase-name. prefix
10b0: 0a 23 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  .# on the table 
10c0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  name is not allo
10d0: 77 65 64 20 77 69 74 68 69 6e 20 74 72 69 67 67  wed within trigg
10e0: 65 72 73 2e 0a 23 0a 64 6f 5f 64 65 6c 65 74 65  ers..#.do_delete
10f0: 5f 74 65 73 74 73 20 65 5f 64 65 6c 65 74 65 2d  _tests e_delete-
1100: 32 2e 31 20 2d 65 72 72 6f 72 20 7b 0a 20 20 71  2.1 -error {.  q
1110: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
1120: 61 6d 65 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c  ames are not all
1130: 6f 77 65 64 20 6f 6e 20 49 4e 53 45 52 54 2c 20  owed on INSERT, 
1140: 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45  UPDATE, and DELE
1150: 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69  TE statements wi
1160: 74 68 69 6e 20 74 72 69 67 67 65 72 73 0a 7d 20  thin triggers.} 
1170: 7b 0a 20 20 31 20 7b 0a 20 20 20 20 20 20 43 52  {.  1 {.      CR
1180: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 31  EATE TRIGGER tr1
1190: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
11a0: 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t1 BEGIN.      
11b0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 6d 61    DELETE FROM ma
11c0: 69 6e 2e 74 32 3b 0a 20 20 20 20 20 20 45 4e 44  in.t2;.      END
11d0: 3b 0a 20 20 7d 20 7b 7d 0a 0a 20 20 32 20 7b 0a  ;.  } {}..  2 {.
11e0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49        CREATE TRI
11f0: 47 47 45 52 20 74 72 31 20 42 45 46 4f 52 45 20  GGER tr1 BEFORE 
1200: 55 50 44 41 54 45 20 4f 4e 20 74 32 20 42 45 47  UPDATE ON t2 BEG
1210: 49 4e 0a 20 20 20 20 20 20 20 20 44 45 4c 45 54  IN.        DELET
1220: 45 20 46 52 4f 4d 20 74 65 6d 70 2e 74 37 20 57  E FROM temp.t7 W
1230: 48 45 52 45 20 61 3d 6e 65 77 2e 61 3b 0a 20 20  HERE a=new.a;.  
1240: 20 20 20 20 45 4e 44 3b 0a 20 20 7d 20 7b 7d 0a      END;.  } {}.
1250: 0a 20 20 33 20 7b 0a 20 20 20 20 20 20 43 52 45  .  3 {.      CRE
1260: 41 54 45 20 54 52 49 47 47 45 52 20 74 72 31 20  ATE TRIGGER tr1 
1270: 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20  AFTER UPDATE ON 
1280: 74 38 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20  t8 BEGIN.       
1290: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 75 78   DELETE FROM aux
12a0: 32 2e 74 38 20 57 48 45 52 45 20 62 21 3d 61 3b  2.t8 WHERE b!=a;
12b0: 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 7d 20  .      END;.  } 
12c0: 7b 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  {}.}..# EVIDENCE
12d0: 2d 4f 46 3a 20 52 2d 32 38 38 31 38 2d 36 33 35  -OF: R-28818-635
12e0: 32 36 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  26 If the table 
12f0: 74 6f 20 77 68 69 63 68 20 74 68 65 20 74 72 69  to which the tri
1300: 67 67 65 72 20 69 73 0a 23 20 61 74 74 61 63 68  gger is.# attach
1310: 65 64 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ed is not in the
1320: 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2c 20   temp database, 
1330: 74 68 65 6e 20 44 45 4c 45 54 45 20 73 74 61 74  then DELETE stat
1340: 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 0a 23 20  ements within.# 
1350: 74 68 65 20 74 72 69 67 67 65 72 20 62 6f 64 79  the trigger body
1360: 20 6d 75 73 74 20 6f 70 65 72 61 74 65 20 6f 6e   must operate on
1370: 20 74 61 62 6c 65 73 20 77 69 74 68 69 6e 20 74   tables within t
1380: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
1390: 20 61 73 0a 23 20 69 74 2e 0a 23 20 0a 23 20 20   as.# it..# .#  
13a0: 20 54 68 69 73 20 69 73 20 74 65 73 74 65 64 20   This is tested 
13b0: 69 6e 20 74 77 6f 20 70 61 72 74 73 2e 20 46 69  in two parts. Fi
13c0: 72 73 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20  rst, check that 
13d0: 69 66 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  if a table of th
13e0: 65 0a 23 20 20 20 73 70 65 63 69 66 69 65 64 20  e.#   specified 
13f0: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  name does not ex
1400: 69 73 74 2c 20 61 6e 20 65 72 72 6f 72 20 69 73  ist, an error is
1410: 20 72 61 69 73 65 64 2e 20 53 65 63 6f 6e 64 6c   raised. Secondl
1420: 79 2c 20 74 65 73 74 0a 23 20 20 20 74 68 61 74  y, test.#   that
1430: 20 69 66 20 74 61 62 6c 65 73 20 77 69 74 68 20   if tables with 
1440: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6e 61  the specified na
1450: 6d 65 20 65 78 69 73 74 20 69 6e 20 6d 75 6c 74  me exist in mult
1460: 69 70 6c 65 20 64 61 74 61 62 61 73 65 73 2c 0a  iple databases,.
1470: 23 20 20 20 74 68 65 20 6c 6f 63 61 6c 20 64 61  #   the local da
1480: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
1490: 75 73 65 64 2e 0a 23 0a 64 6f 5f 64 65 6c 65 74  used..#.do_delet
14a0: 65 5f 74 65 73 74 73 20 65 5f 64 65 6c 65 74 65  e_tests e_delete
14b0: 2d 32 2e 32 2e 31 20 2d 65 72 72 6f 72 20 7b 20  -2.2.1 -error { 
14c0: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
14d0: 73 20 7d 20 7b 0a 20 20 31 20 7b 0a 20 20 20 20  s } {.  1 {.    
14e0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
14f0: 20 6d 61 69 6e 2e 74 72 31 20 41 46 54 45 52 20   main.tr1 AFTER 
1500: 49 4e 53 45 52 54 20 4f 4e 20 6d 61 69 6e 2e 74  INSERT ON main.t
1510: 37 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20  7 BEGIN.        
1520: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 39 3b 0a  DELETE FROM t9;.
1530: 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 20        END;.     
1540: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69   INSERT INTO mai
1550: 6e 2e 74 37 20 56 41 4c 55 45 53 28 31 2c 20 32  n.t7 VALUES(1, 2
1560: 29 3b 0a 20 20 7d 20 7b 6d 61 69 6e 2e 74 39 7d  );.  } {main.t9}
1570: 0a 0a 20 20 32 20 7b 0a 20 20 20 20 20 20 43 52  ..  2 {.      CR
1580: 45 41 54 45 20 54 52 49 47 47 45 52 20 61 75 78  EATE TRIGGER aux
1590: 2e 74 72 32 20 42 45 46 4f 52 45 20 55 50 44 41  .tr2 BEFORE UPDA
15a0: 54 45 20 4f 4e 20 74 39 20 42 45 47 49 4e 0a 20  TE ON t9 BEGIN. 
15b0: 20 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52         DELETE FR
15c0: 4f 4d 20 74 31 30 3b 0a 20 20 20 20 20 20 45 4e  OM t10;.      EN
15d0: 44 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  D;.      UPDATE 
15e0: 74 39 20 53 45 54 20 61 3d 31 3b 0a 20 20 7d 20  t9 SET a=1;.  } 
15f0: 7b 61 75 78 2e 74 31 30 7d 0a 7d 0a 64 6f 5f 65  {aux.t10}.}.do_e
1600: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 64 65  xecsql_test e_de
1610: 6c 65 74 65 2d 32 2e 32 2e 58 20 7b 0a 20 20 44  lete-2.2.X {.  D
1620: 52 4f 50 20 54 52 49 47 47 45 52 20 6d 61 69 6e  ROP TRIGGER main
1630: 2e 74 72 31 3b 0a 20 20 44 52 4f 50 20 54 52 49  .tr1;.  DROP TRI
1640: 47 47 45 52 20 61 75 78 2e 74 72 32 3b 0a 7d 20  GGER aux.tr2;.} 
1650: 7b 7d 0a 0a 64 6f 5f 64 65 6c 65 74 65 5f 74 65  {}..do_delete_te
1660: 73 74 73 20 65 5f 64 65 6c 65 74 65 2d 32 2e 32  sts e_delete-2.2
1670: 2e 32 20 7b 0a 20 20 31 20 7b 0a 20 20 20 20 20  .2 {.  1 {.     
1680: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
1690: 61 75 78 2e 74 72 31 20 41 46 54 45 52 20 49 4e  aux.tr1 AFTER IN
16a0: 53 45 52 54 20 4f 4e 20 74 38 20 42 45 47 49 4e  SERT ON t8 BEGIN
16b0: 0a 20 20 20 20 20 20 20 20 44 45 4c 45 54 45 20  .        DELETE 
16c0: 46 52 4f 4d 20 74 39 3b 0a 20 20 20 20 20 20 45  FROM t9;.      E
16d0: 4e 44 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ND;.      INSERT
16e0: 20 49 4e 54 4f 20 61 75 78 2e 74 38 20 56 41 4c   INTO aux.t8 VAL
16f0: 55 45 53 28 31 2c 20 32 29 3b 0a 0a 20 20 20 20  UES(1, 2);..    
1700: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
1710: 29 20 46 52 4f 4d 20 61 75 78 2e 74 39 20 0a 20  ) FROM aux.t9 . 
1720: 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1730: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .      SELECT co
1740: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 75 78 32  unt(*) FROM aux2
1750: 2e 74 39 3b 0a 20 20 7d 20 7b 30 20 31 7d 0a 0a  .t9;.  } {0 1}..
1760: 20 20 32 20 7b 0a 20 20 20 20 20 20 43 52 45 41    2 {.      CREA
1770: 54 45 20 54 52 49 47 47 45 52 20 6d 61 69 6e 2e  TE TRIGGER main.
1780: 74 72 31 20 41 46 54 45 52 20 49 4e 53 45 52 54  tr1 AFTER INSERT
1790: 20 4f 4e 20 74 38 20 42 45 47 49 4e 0a 20 20 20   ON t8 BEGIN.   
17a0: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
17b0: 20 74 37 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a   t7;.      END;.
17c0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
17d0: 4f 20 6d 61 69 6e 2e 74 38 20 56 41 4c 55 45 53  O main.t8 VALUES
17e0: 28 31 2c 20 32 29 3b 0a 0a 20 20 20 20 20 20 53  (1, 2);..      S
17f0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1800: 52 4f 4d 20 74 65 6d 70 2e 74 37 20 0a 20 20 20  ROM temp.t7 .   
1810: 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1820: 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e       SELECT coun
1830: 74 28 2a 29 20 46 52 4f 4d 20 6d 61 69 6e 2e 74  t(*) FROM main.t
1840: 37 0a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  7.        UNION 
1850: 41 4c 4c 0a 20 20 20 20 20 20 53 45 4c 45 43 54  ALL.      SELECT
1860: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61   count(*) FROM a
1870: 75 78 2e 74 37 0a 20 20 20 20 20 20 20 20 55 4e  ux.t7.        UN
1880: 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 53 45  ION ALL.      SE
1890: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
18a0: 4f 4d 20 61 75 78 32 2e 74 37 3b 0a 20 20 7d 20  OM aux2.t7;.  } 
18b0: 7b 31 20 30 20 31 20 31 7d 0a 7d 0a 0a 23 20 45  {1 0 1 1}.}..# E
18c0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31  VIDENCE-OF: R-31
18d0: 35 36 37 2d 33 38 35 38 37 20 49 66 20 74 68 65  567-38587 If the
18e0: 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68 20   table to which 
18f0: 74 68 65 20 74 72 69 67 67 65 72 20 69 73 0a 23  the trigger is.#
1900: 20 61 74 74 61 63 68 65 64 20 69 73 20 69 6e 20   attached is in 
1910: 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
1920: 65 2c 20 74 68 65 6e 20 74 68 65 20 75 6e 71 75  e, then the unqu
1930: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
1940: 74 68 65 0a 23 20 74 61 62 6c 65 20 62 65 69 6e  the.# table bein
1950: 67 20 64 65 6c 65 74 65 64 20 69 73 20 72 65 73  g deleted is res
1960: 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 73 61 6d  olved in the sam
1970: 65 20 77 61 79 20 61 73 20 69 74 20 69 73 20 66  e way as it is f
1980: 6f 72 20 61 0a 23 20 74 6f 70 2d 6c 65 76 65 6c  or a.# top-level
1990: 20 73 74 61 74 65 6d 65 6e 74 20 28 62 79 20 73   statement (by s
19a0: 65 61 72 63 68 69 6e 67 20 66 69 72 73 74 20 74  earching first t
19b0: 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  he TEMP database
19c0: 2c 20 74 68 65 6e 20 74 68 65 0a 23 20 6d 61 69  , then the.# mai
19d0: 6e 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  n database, then
19e0: 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62   any other datab
19f0: 61 73 65 73 20 69 6e 20 74 68 65 20 6f 72 64 65  ases in the orde
1a00: 72 20 74 68 65 79 20 77 65 72 65 0a 23 20 61 74  r they were.# at
1a10: 74 61 63 68 65 64 29 2e 0a 23 0a 64 6f 5f 65 78  tached)..#.do_ex
1a20: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 64 65 6c  ecsql_test e_del
1a30: 65 74 65 2d 32 2e 33 2e 30 20 7b 0a 20 20 44 52  ete-2.3.0 {.  DR
1a40: 4f 50 20 54 52 49 47 47 45 52 20 61 75 78 2e 74  OP TRIGGER aux.t
1a50: 72 31 3b 0a 20 20 44 52 4f 50 20 54 52 49 47 47  r1;.  DROP TRIGG
1a60: 45 52 20 6d 61 69 6e 2e 74 72 31 3b 0a 20 20 44  ER main.tr1;.  D
1a70: 45 4c 45 54 45 20 46 52 4f 4d 20 6d 61 69 6e 2e  ELETE FROM main.
1a80: 74 38 20 57 48 45 52 45 20 6f 69 64 3e 31 3b 0a  t8 WHERE oid>1;.
1a90: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 75    DELETE FROM au
1aa0: 78 2e 74 38 20 57 48 45 52 45 20 6f 69 64 3e 31  x.t8 WHERE oid>1
1ab0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
1ac0: 61 75 78 2e 74 39 20 56 41 4c 55 45 53 28 31 2c  aux.t9 VALUES(1,
1ad0: 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   2);.  INSERT IN
1ae0: 54 4f 20 6d 61 69 6e 2e 74 37 20 56 41 4c 55 45  TO main.t7 VALUE
1af0: 53 28 33 2c 20 34 29 3b 0a 7d 20 7b 7d 0a 64 6f  S(3, 4);.} {}.do
1b00: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
1b10: 64 65 6c 65 74 65 2d 32 2e 33 2e 31 20 7b 0a 20  delete-2.3.1 {. 
1b20: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1b30: 20 46 52 4f 4d 20 74 65 6d 70 2e 74 37 20 55 4e   FROM temp.t7 UN
1b40: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 63  ION ALL SELECT c
1b50: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 6d 61 69  ount(*) FROM mai
1b60: 6e 2e 74 37 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20  n.t7 UNION ALL. 
1b70: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1b80: 20 46 52 4f 4d 20 61 75 78 2e 74 37 20 20 55 4e   FROM aux.t7  UN
1b90: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 63  ION ALL SELECT c
1ba0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 75 78  ount(*) FROM aux
1bb0: 32 2e 74 37 3b 0a 0a 20 20 53 45 4c 45 43 54 20  2.t7;..  SELECT 
1bc0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 6d 61  count(*) FROM ma
1bd0: 69 6e 2e 74 38 20 55 4e 49 4f 4e 20 41 4c 4c 20  in.t8 UNION ALL 
1be0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1bf0: 46 52 4f 4d 20 61 75 78 2e 74 38 20 20 0a 20 20  FROM aux.t8  .  
1c00: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
1c10: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61   count(*) FROM a
1c20: 75 78 32 2e 74 38 3b 0a 0a 20 20 53 45 4c 45 43  ux2.t8;..  SELEC
1c30: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1c40: 61 75 78 2e 74 39 20 20 55 4e 49 4f 4e 20 41 4c  aux.t9  UNION AL
1c50: 4c 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  L SELECT count(*
1c60: 29 20 46 52 4f 4d 20 61 75 78 32 2e 74 39 3b 0a  ) FROM aux2.t9;.
1c70: 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  .  SELECT count(
1c80: 2a 29 20 46 52 4f 4d 20 61 75 78 32 2e 74 31 30  *) FROM aux2.t10
1c90: 3b 0a 7d 20 7b 31 20 31 20 31 20 31 20 31 20 31  ;.} {1 1 1 1 1 1
1ca0: 20 31 20 31 20 31 20 31 7d 0a 64 6f 5f 65 78 65   1 1 1 1}.do_exe
1cb0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 64 65 6c 65  csql_test e_dele
1cc0: 74 65 2d 32 2e 33 2e 32 20 7b 0a 20 20 43 52 45  te-2.3.2 {.  CRE
1cd0: 41 54 45 20 54 52 49 47 47 45 52 20 74 65 6d 70  ATE TRIGGER temp
1ce0: 2e 74 72 31 20 41 46 54 45 52 20 49 4e 53 45 52  .tr1 AFTER INSER
1cf0: 54 20 4f 4e 20 74 37 20 42 45 47 49 4e 0a 20 20  T ON t7 BEGIN.  
1d00: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 37    DELETE FROM t7
1d10: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
1d20: 4d 20 74 38 3b 0a 20 20 20 20 44 45 4c 45 54 45  M t8;.    DELETE
1d30: 20 46 52 4f 4d 20 74 39 3b 0a 20 20 20 20 44 45   FROM t9;.    DE
1d40: 4c 45 54 45 20 46 52 4f 4d 20 74 31 30 3b 0a 20  LETE FROM t10;. 
1d50: 20 45 4e 44 3b 0a 20 20 49 4e 53 45 52 54 20 49   END;.  INSERT I
1d60: 4e 54 4f 20 74 65 6d 70 2e 74 37 20 56 41 4c 55  NTO temp.t7 VALU
1d70: 45 53 28 27 68 65 6c 6c 6f 27 2c 20 27 77 6f 72  ES('hello', 'wor
1d80: 6c 64 27 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65 78  ld');.} {}.do_ex
1d90: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 64 65 6c  ecsql_test e_del
1da0: 65 74 65 2d 32 2e 33 2e 33 20 7b 0a 20 20 53 45  ete-2.3.3 {.  SE
1db0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1dc0: 4f 4d 20 74 65 6d 70 2e 74 37 20 55 4e 49 4f 4e  OM temp.t7 UNION
1dd0: 20 41 4c 4c 20 53 45 4c 45 43 54 20 63 6f 75 6e   ALL SELECT coun
1de0: 74 28 2a 29 20 46 52 4f 4d 20 6d 61 69 6e 2e 74  t(*) FROM main.t
1df0: 37 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 53 45  7 UNION ALL.  SE
1e00: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1e10: 4f 4d 20 61 75 78 2e 74 37 20 20 55 4e 49 4f 4e  OM aux.t7  UNION
1e20: 20 41 4c 4c 20 53 45 4c 45 43 54 20 63 6f 75 6e   ALL SELECT coun
1e30: 74 28 2a 29 20 46 52 4f 4d 20 61 75 78 32 2e 74  t(*) FROM aux2.t
1e40: 37 3b 0a 0a 20 20 53 45 4c 45 43 54 20 63 6f 75  7;..  SELECT cou
1e50: 6e 74 28 2a 29 20 46 52 4f 4d 20 6d 61 69 6e 2e  nt(*) FROM main.
1e60: 74 38 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  t8 UNION ALL SEL
1e70: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1e80: 4d 20 61 75 78 2e 74 38 20 20 0a 20 20 55 4e 49  M aux.t8  .  UNI
1e90: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 63 6f  ON ALL SELECT co
1ea0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 75 78 32  unt(*) FROM aux2
1eb0: 2e 74 38 3b 0a 0a 20 20 53 45 4c 45 43 54 20 63  .t8;..  SELECT c
1ec0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 75 78  ount(*) FROM aux
1ed0: 2e 74 39 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  .t9  UNION ALL S
1ee0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1ef0: 52 4f 4d 20 61 75 78 32 2e 74 39 3b 0a 0a 20 20  ROM aux2.t9;..  
1f00: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1f10: 46 52 4f 4d 20 61 75 78 32 2e 74 31 30 3b 0a 7d  FROM aux2.t10;.}
1f20: 20 7b 30 20 31 20 31 20 31 20 30 20 31 20 31 20   {0 1 1 1 0 1 1 
1f30: 30 20 31 20 30 7d 0a 0a 23 20 45 56 49 44 45 4e  0 1 0}..# EVIDEN
1f40: 43 45 2d 4f 46 3a 20 52 2d 32 38 36 39 31 2d 34  CE-OF: R-28691-4
1f50: 39 34 36 34 20 54 68 65 20 49 4e 44 45 58 45 44  9464 The INDEXED
1f60: 20 42 59 20 61 6e 64 20 4e 4f 54 20 49 4e 44 45   BY and NOT INDE
1f70: 58 45 44 20 63 6c 61 75 73 65 73 20 61 72 65 0a  XED clauses are.
1f80: 23 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  # not allowed on
1f90: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
1fa0: 74 73 20 77 69 74 68 69 6e 20 74 72 69 67 67 65  ts within trigge
1fb0: 72 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  rs..#.do_execsql
1fc0: 5f 74 65 73 74 20 65 5f 64 65 6c 65 74 65 2d 32  _test e_delete-2
1fd0: 2e 34 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  .4.0 {.  CREATE 
1fe0: 49 4e 44 45 58 20 69 38 20 4f 4e 20 74 38 28 61  INDEX i8 ON t8(a
1ff0: 2c 20 62 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 64 65  , b);.} {}.do_de
2000: 6c 65 74 65 5f 74 65 73 74 73 20 65 5f 64 65 6c  lete_tests e_del
2010: 65 74 65 2d 32 2e 34 20 2d 65 72 72 6f 72 20 7b  ete-2.4 -error {
2020: 0a 20 20 74 68 65 20 25 73 20 25 73 20 63 6c 61  .  the %s %s cla
2030: 75 73 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  use is not allow
2040: 65 64 20 6f 6e 20 55 50 44 41 54 45 20 6f 72 20  ed on UPDATE or 
2050: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
2060: 73 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72  s within trigger
2070: 73 0a 7d 20 7b 0a 20 20 31 20 7b 0a 20 20 20 20  s.} {.  1 {.    
2080: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
2090: 72 33 20 41 46 54 45 52 20 49 4e 53 45 52 54 20  r3 AFTER INSERT 
20a0: 4f 4e 20 74 38 20 42 45 47 49 4e 0a 20 20 20 20  ON t8 BEGIN.    
20b0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 38    DELETE FROM t8
20c0: 20 49 4e 44 45 58 45 44 20 42 59 20 69 38 20 57   INDEXED BY i8 W
20d0: 48 45 52 45 20 61 3d 35 3b 0a 20 20 20 20 45 4e  HERE a=5;.    EN
20e0: 44 3b 0a 20 20 7d 20 7b 49 4e 44 45 58 45 44 20  D;.  } {INDEXED 
20f0: 42 59 7d 0a 20 20 32 20 7b 0a 20 20 20 20 43 52  BY}.  2 {.    CR
2100: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 33  EATE TRIGGER tr3
2110: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
2120: 20 74 38 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t8 BEGIN.      
2130: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 38 20 4e  DELETE FROM t8 N
2140: 4f 54 20 49 4e 44 45 58 45 44 20 57 48 45 52 45  OT INDEXED WHERE
2150: 20 61 3d 35 3b 0a 20 20 20 20 45 4e 44 3b 0a 20   a=5;.    END;. 
2160: 20 7d 20 7b 4e 4f 54 20 49 4e 44 45 58 45 44 7d   } {NOT INDEXED}
2170: 0a 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 75 70  .}..ifcapable up
2180: 64 61 74 65 5f 64 65 6c 65 74 65 5f 6c 69 6d 69  date_delete_limi
2190: 74 20 7b 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  t {..# EVIDENCE-
21a0: 4f 46 3a 20 52 2d 36 34 39 34 32 2d 30 36 36 31  OF: R-64942-0661
21b0: 35 20 54 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  5 The LIMIT and 
21c0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
21d0: 20 28 64 65 73 63 72 69 62 65 64 0a 23 20 62 65   (described.# be
21e0: 6c 6f 77 29 20 61 72 65 20 75 6e 73 75 70 70 6f  low) are unsuppo
21f0: 72 74 65 64 20 66 6f 72 20 44 45 4c 45 54 45 20  rted for DELETE 
2200: 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69  statements withi
2210: 6e 20 74 72 69 67 67 65 72 73 2e 0a 23 0a 64 6f  n triggers..#.do
2220: 5f 64 65 6c 65 74 65 5f 74 65 73 74 73 20 65 5f  _delete_tests e_
2230: 64 65 6c 65 74 65 2d 32 2e 35 20 2d 65 72 72 6f  delete-2.5 -erro
2240: 72 20 7b 20 6e 65 61 72 20 22 25 73 22 3a 20 73  r { near "%s": s
2250: 79 6e 74 61 78 20 65 72 72 6f 72 20 7d 20 7b 0a  yntax error } {.
2260: 20 20 31 20 7b 0a 20 20 20 20 43 52 45 41 54 45    1 {.    CREATE
2270: 20 54 52 49 47 47 45 52 20 74 72 33 20 41 46 54   TRIGGER tr3 AFT
2280: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 38 20  ER INSERT ON t8 
2290: 42 45 47 49 4e 0a 20 20 20 20 20 20 44 45 4c 45  BEGIN.      DELE
22a0: 54 45 20 46 52 4f 4d 20 74 38 20 4c 49 4d 49 54  TE FROM t8 LIMIT
22b0: 20 31 30 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20   10;.    END;.  
22c0: 7d 20 7b 4c 49 4d 49 54 7d 0a 20 20 32 20 7b 0a  } {LIMIT}.  2 {.
22d0: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
22e0: 45 52 20 74 72 33 20 41 46 54 45 52 20 49 4e 53  ER tr3 AFTER INS
22f0: 45 52 54 20 4f 4e 20 74 38 20 42 45 47 49 4e 0a  ERT ON t8 BEGIN.
2300: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
2310: 4d 20 74 38 20 4f 52 44 45 52 20 42 59 20 61 20  M t8 ORDER BY a 
2320: 4c 49 4d 49 54 20 35 3b 0a 20 20 20 20 45 4e 44  LIMIT 5;.    END
2330: 3b 0a 20 20 7d 20 7b 4f 52 44 45 52 7d 0a 7d 0a  ;.  } {ORDER}.}.
2340: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
2350: 52 2d 34 30 30 32 36 2d 31 30 35 33 31 20 49 66  R-40026-10531 If
2360: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
2370: 6c 65 64 20 77 69 74 68 20 74 68 65 0a 23 20 53  led with the.# S
2380: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44  QLITE_ENABLE_UPD
2390: 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54  ATE_DELETE_LIMIT
23a0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
23b0: 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 73  tion, then the s
23c0: 79 6e 74 61 78 0a 23 20 6f 66 20 74 68 65 20 44  yntax.# of the D
23d0: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
23e0: 69 73 20 65 78 74 65 6e 64 65 64 20 62 79 20 74  is extended by t
23f0: 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 6f  he addition of o
2400: 70 74 69 6f 6e 61 6c 20 4f 52 44 45 52 0a 23 20  ptional ORDER.# 
2410: 42 59 20 61 6e 64 20 4c 49 4d 49 54 20 63 6c 61  BY and LIMIT cla
2420: 75 73 65 73 3a 0a 23 0a 23 20 2d 2d 20 73 79 6e  uses:.#.# -- syn
2430: 74 61 78 20 64 69 61 67 72 61 6d 20 64 65 6c 65  tax diagram dele
2440: 74 65 2d 73 74 6d 74 2d 6c 69 6d 69 74 65 64 0a  te-stmt-limited.
2450: 23 0a 64 6f 5f 64 65 6c 65 74 65 5f 74 65 73 74  #.do_delete_test
2460: 73 20 65 5f 64 65 6c 65 74 65 2d 33 2e 31 20 7b  s e_delete-3.1 {
2470: 0a 20 20 31 20 20 20 22 44 45 4c 45 54 45 20 46  .  1   "DELETE F
2480: 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 35 22 20  ROM t1 LIMIT 5" 
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 20 7b 7d 0a 20 20 32 20 20 20 22 44 45 4c     {}.  2   "DEL
24c0: 45 54 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49  ETE FROM t1 LIMI
24d0: 54 20 35 2d 31 20 4f 46 46 53 45 54 20 32 2b 32  T 5-1 OFFSET 2+2
24e0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
24f0: 20 20 20 20 20 20 20 20 7b 7d 0a 20 20 33 20 20          {}.  3  
2500: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31   "DELETE FROM t1
2510: 20 4c 49 4d 49 54 20 32 2b 32 2c 20 31 36 2f 34   LIMIT 2+2, 16/4
2520: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 7d 0a               {}.
2540: 20 20 34 20 20 20 22 44 45 4c 45 54 45 20 46 52    4   "DELETE FR
2550: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 78  OM t1 ORDER BY x
2560: 20 4c 49 4d 49 54 20 35 22 20 20 20 20 20 20 20   LIMIT 5"       
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 7b 7d 0a 20 20 35 20 20 20 22 44 45 4c 45    {}.  5   "DELE
2590: 54 45 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52  TE FROM t1 ORDER
25a0: 20 42 59 20 78 20 4c 49 4d 49 54 20 35 2d 31 20   BY x LIMIT 5-1 
25b0: 4f 46 46 53 45 54 20 32 2b 32 22 20 20 20 20 20  OFFSET 2+2"     
25c0: 20 20 20 20 20 20 20 7b 7d 0a 20 20 36 20 20 20         {}.  6   
25d0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20  "DELETE FROM t1 
25e0: 4f 52 44 45 52 20 42 59 20 78 20 4c 49 4d 49 54  ORDER BY x LIMIT
25f0: 20 32 2b 32 2c 20 31 36 2f 34 22 20 20 20 20 20   2+2, 16/4"     
2600: 20 20 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 20              {}. 
2610: 20 37 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f   7   "DELETE FRO
2620: 4d 20 74 31 20 57 48 45 52 45 20 78 3e 32 20 4c  M t1 WHERE x>2 L
2630: 49 4d 49 54 20 35 22 20 20 20 20 20 20 20 20 20  IMIT 5"         
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 7b 7d 0a 20 20 38 20 20 20 22 44 45 4c 45 54   {}.  8   "DELET
2660: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
2670: 78 3e 32 20 4c 49 4d 49 54 20 35 2d 31 20 4f 46  x>2 LIMIT 5-1 OF
2680: 46 53 45 54 20 32 2b 32 22 20 20 20 20 20 20 20  FSET 2+2"       
2690: 20 20 20 20 20 20 7b 7d 0a 20 20 39 20 20 20 22        {}.  9   "
26a0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
26b0: 48 45 52 45 20 78 3e 32 20 4c 49 4d 49 54 20 32  HERE x>2 LIMIT 2
26c0: 2b 32 2c 20 31 36 2f 34 22 20 20 20 20 20 20 20  +2, 16/4"       
26d0: 20 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20             {}.  
26e0: 31 30 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  10  "DELETE FROM
26f0: 20 74 31 20 57 48 45 52 45 20 78 3e 32 20 4f 52   t1 WHERE x>2 OR
2700: 44 45 52 20 42 59 20 78 20 4c 49 4d 49 54 20 35  DER BY x LIMIT 5
2710: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
2720: 7b 7d 0a 20 20 31 31 20 20 22 44 45 4c 45 54 45  {}.  11  "DELETE
2730: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78   FROM t1 WHERE x
2740: 3e 32 20 4f 52 44 45 52 20 42 59 20 78 20 4c 49  >2 ORDER BY x LI
2750: 4d 49 54 20 35 2d 31 20 4f 46 46 53 45 54 20 32  MIT 5-1 OFFSET 2
2760: 2b 32 22 20 20 7b 7d 0a 20 20 31 32 20 20 22 44  +2"  {}.  12  "D
2770: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
2780: 45 52 45 20 78 3e 32 20 4f 52 44 45 52 20 42 59  ERE x>2 ORDER BY
2790: 20 78 20 4c 49 4d 49 54 20 32 2b 32 2c 20 31 36   x LIMIT 2+2, 16
27a0: 2f 34 22 20 20 20 20 20 20 20 7b 7d 0a 7d 0a 0a  /4"       {}.}..
27b0: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
27c0: 70 72 6f 63 20 72 65 62 75 69 6c 64 5f 74 31 20  proc rebuild_t1 
27d0: 7b 7d 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  {} {.  catchsql 
27e0: 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31 20  { DROP TABLE t1 
27f0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
2800: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2810: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  1(a, b);.    INS
2820: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2830: 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20  ES(1, 'one');.  
2840: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2850: 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27   VALUES(2, 'two'
2860: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2870: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
2880: 27 74 68 72 65 65 27 29 3b 0a 20 20 20 20 49 4e  'three');.    IN
2890: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
28a0: 55 45 53 28 34 2c 20 27 66 6f 75 72 27 29 3b 0a  UES(4, 'four');.
28b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
28c0: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 27 66 69  t1 VALUES(5, 'fi
28d0: 76 65 27 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 20 45  ve');.  }.}..# E
28e0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
28f0: 30 36 32 2d 30 38 35 35 30 20 49 66 20 61 20 44  062-08550 If a D
2900: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
2910: 68 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  has a LIMIT clau
2920: 73 65 2c 0a 23 20 74 68 65 20 6d 61 78 69 6d 75  se,.# the maximu
2930: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  m number of rows
2940: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 64 65   that will be de
2950: 6c 65 74 65 64 20 69 73 20 66 6f 75 6e 64 20 62  leted is found b
2960: 79 20 65 76 61 6c 75 61 74 69 6e 67 0a 23 20 74  y evaluating.# t
2970: 68 65 20 61 63 63 6f 6d 70 61 6e 79 69 6e 67 20  he accompanying 
2980: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 63  expression and c
2990: 61 73 74 69 6e 67 20 69 74 20 74 6f 20 61 6e 20  asting it to an 
29a0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 23  integer value..#
29b0: 0a 72 65 62 75 69 6c 64 5f 74 31 0a 64 6f 5f 64  .rebuild_t1.do_d
29c0: 65 6c 65 74 65 5f 74 65 73 74 73 20 65 5f 64 65  elete_tests e_de
29d0: 6c 65 74 65 2d 33 2e 32 20 2d 72 65 70 61 69 72  lete-3.2 -repair
29e0: 20 72 65 62 75 69 6c 64 5f 74 31 20 2d 71 75 65   rebuild_t1 -que
29f0: 72 79 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 20  ry {.  SELECT a 
2a00: 46 52 4f 4d 20 74 31 0a 7d 20 7b 0a 20 20 31 20  FROM t1.} {.  1 
2a10: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74    "DELETE FROM t
2a20: 31 20 4c 49 4d 49 54 20 33 22 20 20 20 20 20 20  1 LIMIT 3"      
2a30: 20 7b 34 20 35 7d 0a 20 20 32 20 20 20 22 44 45   {4 5}.  2   "DE
2a40: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d  LETE FROM t1 LIM
2a50: 49 54 20 31 2b 31 22 20 20 20 20 20 7b 33 20 34  IT 1+1"     {3 4
2a60: 20 35 7d 0a 20 20 33 20 20 20 22 44 45 4c 45 54   5}.  3   "DELET
2a70: 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20  E FROM t1 LIMIT 
2a80: 27 34 27 22 20 20 20 20 20 7b 35 7d 0a 20 20 34  '4'"     {5}.  4
2a90: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
2aa0: 74 31 20 4c 49 4d 49 54 20 27 31 2e 30 27 22 20  t1 LIMIT '1.0'" 
2ab0: 20 20 7b 32 20 33 20 34 20 35 7d 0a 7d 0a 0a 23    {2 3 4 5}.}..#
2ac0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2ad0: 30 32 36 36 31 2d 35 36 33 39 39 20 49 66 20 74  02661-56399 If t
2ae0: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
2af0: 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20   evaluating the 
2b00: 4c 49 4d 49 54 0a 23 20 63 6c 61 75 73 65 20 63  LIMIT.# clause c
2b10: 61 6e 6e 6f 74 20 62 65 20 6c 6f 73 73 6c 65 73  annot be lossles
2b20: 73 6c 79 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  sly converted to
2b30: 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
2b40: 65 2c 20 69 74 20 69 73 20 61 6e 0a 23 20 65 72  e, it is an.# er
2b50: 72 6f 72 2e 0a 23 0a 64 6f 5f 64 65 6c 65 74 65  ror..#.do_delete
2b60: 5f 74 65 73 74 73 20 65 5f 64 65 6c 65 74 65 2d  _tests e_delete-
2b70: 33 2e 33 20 2d 65 72 72 6f 72 20 7b 20 64 61 74  3.3 -error { dat
2b80: 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 20 7d  atype mismatch }
2b90: 20 7b 0a 20 20 31 20 20 20 22 44 45 4c 45 54 45   {.  1   "DELETE
2ba0: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 27   FROM t1 LIMIT '
2bb0: 61 62 63 27 22 20 20 20 7b 7d 0a 20 20 32 20 20  abc'"   {}.  2  
2bc0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31   "DELETE FROM t1
2bd0: 20 4c 49 4d 49 54 20 4e 55 4c 4c 22 20 20 20 20   LIMIT NULL"    
2be0: 7b 7d 0a 20 20 33 20 20 20 22 44 45 4c 45 54 45  {}.  3   "DELETE
2bf0: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 58   FROM t1 LIMIT X
2c00: 27 41 42 43 44 27 22 20 7b 7d 0a 20 20 34 20 20  'ABCD'" {}.  4  
2c10: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31   "DELETE FROM t1
2c20: 20 4c 49 4d 49 54 20 31 2e 32 22 20 20 20 20 20   LIMIT 1.2"     
2c30: 7b 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  {}.}..# EVIDENCE
2c40: 2d 4f 46 3a 20 52 2d 30 30 35 39 38 2d 30 33 37  -OF: R-00598-037
2c50: 34 31 20 41 20 6e 65 67 61 74 69 76 65 20 4c 49  41 A negative LI
2c60: 4d 49 54 20 76 61 6c 75 65 20 69 73 20 69 6e 74  MIT value is int
2c70: 65 72 70 72 65 74 65 64 20 61 73 0a 23 20 22 6e  erpreted as.# "n
2c80: 6f 20 6c 69 6d 69 74 22 2e 0a 23 0a 64 6f 5f 64  o limit"..#.do_d
2c90: 65 6c 65 74 65 5f 74 65 73 74 73 20 65 5f 64 65  elete_tests e_de
2ca0: 6c 65 74 65 2d 33 2e 34 20 2d 72 65 70 61 69 72  lete-3.4 -repair
2cb0: 20 72 65 62 75 69 6c 64 5f 74 31 20 2d 71 75 65   rebuild_t1 -que
2cc0: 72 79 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 20  ry {.  SELECT a 
2cd0: 46 52 4f 4d 20 74 31 0a 7d 20 7b 0a 20 20 31 20  FROM t1.} {.  1 
2ce0: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74    "DELETE FROM t
2cf0: 31 20 4c 49 4d 49 54 20 2d 31 22 20 20 20 20 20  1 LIMIT -1"     
2d00: 20 20 7b 7d 0a 20 20 32 20 20 20 22 44 45 4c 45    {}.  2   "DELE
2d10: 54 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54  TE FROM t1 LIMIT
2d20: 20 32 2d 34 22 20 20 20 20 20 20 7b 7d 0a 20 20   2-4"      {}.  
2d30: 33 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  3   "DELETE FROM
2d40: 20 74 31 20 4c 49 4d 49 54 20 2d 34 2e 30 22 20   t1 LIMIT -4.0" 
2d50: 20 20 20 20 7b 7d 0a 20 20 34 20 20 20 22 44 45      {}.  4   "DE
2d60: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d  LETE FROM t1 LIM
2d70: 49 54 20 35 2a 2d 31 22 20 20 20 20 20 7b 7d 0a  IT 5*-1"     {}.
2d80: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
2d90: 3a 20 52 2d 32 36 33 37 37 2d 34 39 31 39 35 20  : R-26377-49195 
2da0: 49 66 20 74 68 65 20 44 45 4c 45 54 45 20 73 74  If the DELETE st
2db0: 61 74 65 6d 65 6e 74 20 61 6c 73 6f 20 68 61 73  atement also has
2dc0: 20 61 6e 20 4f 46 46 53 45 54 0a 23 20 63 6c 61   an OFFSET.# cla
2dd0: 75 73 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  use, then it is 
2de0: 73 69 6d 69 6c 61 72 6c 79 20 65 76 61 6c 75 61  similarly evalua
2df0: 74 65 64 20 61 6e 64 20 63 61 73 74 20 74 6f 20  ted and cast to 
2e00: 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
2e10: 2e 0a 23 20 41 67 61 69 6e 2c 20 69 74 20 69 73  ..# Again, it is
2e20: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
2e30: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
2e40: 20 6c 6f 73 73 6c 65 73 73 6c 79 20 63 6f 6e 76   losslessly conv
2e50: 65 72 74 65 64 20 74 6f 0a 23 20 61 6e 20 69 6e  erted to.# an in
2e60: 74 65 67 65 72 2e 0a 23 0a 64 6f 5f 64 65 6c 65  teger..#.do_dele
2e70: 74 65 5f 74 65 73 74 73 20 65 5f 64 65 6c 65 74  te_tests e_delet
2e80: 65 2d 33 2e 35 20 2d 65 72 72 6f 72 20 7b 20 64  e-3.5 -error { d
2e90: 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68  atatype mismatch
2ea0: 20 7d 20 7b 0a 20 20 31 20 20 20 22 44 45 4c 45   } {.  1   "DELE
2eb0: 54 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54  TE FROM t1 LIMIT
2ec0: 20 31 20 4f 46 46 53 45 54 20 27 61 62 63 27 22   1 OFFSET 'abc'"
2ed0: 20 20 20 7b 7d 0a 20 20 32 20 20 20 22 44 45 4c     {}.  2   "DEL
2ee0: 45 54 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49  ETE FROM t1 LIMI
2ef0: 54 20 31 20 4f 46 46 53 45 54 20 4e 55 4c 4c 22  T 1 OFFSET NULL"
2f00: 20 20 20 20 7b 7d 0a 20 20 33 20 20 20 22 44 45      {}.  3   "DE
2f10: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d  LETE FROM t1 LIM
2f20: 49 54 20 31 20 4f 46 46 53 45 54 20 58 27 41 42  IT 1 OFFSET X'AB
2f30: 43 44 27 22 20 7b 7d 0a 20 20 34 20 20 20 22 44  CD'" {}.  4   "D
2f40: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4c 49  ELETE FROM t1 LI
2f50: 4d 49 54 20 31 20 4f 46 46 53 45 54 20 31 2e 32  MIT 1 OFFSET 1.2
2f60: 22 20 20 20 20 20 7b 7d 0a 20 20 35 20 20 20 22  "     {}.  5   "
2f70: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4c  DELETE FROM t1 L
2f80: 49 4d 49 54 20 27 61 62 63 27 2c 20 31 22 20 20  IMIT 'abc', 1"  
2f90: 20 20 20 20 20 20 20 7b 7d 0a 20 20 36 20 20 20         {}.  6   
2fa0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20  "DELETE FROM t1 
2fb0: 4c 49 4d 49 54 20 4e 55 4c 4c 2c 20 31 22 20 20  LIMIT NULL, 1"  
2fc0: 20 20 20 20 20 20 20 20 7b 7d 0a 20 20 37 20 20          {}.  7  
2fd0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31   "DELETE FROM t1
2fe0: 20 4c 49 4d 49 54 20 58 27 41 42 43 44 27 2c 20   LIMIT X'ABCD', 
2ff0: 31 22 20 20 20 20 20 20 20 7b 7d 0a 20 20 38 20  1"       {}.  8 
3000: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74    "DELETE FROM t
3010: 31 20 4c 49 4d 49 54 20 31 2e 32 2c 20 31 22 20  1 LIMIT 1.2, 1" 
3020: 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 7d 0a 0a            {}.}..
3030: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
3040: 52 2d 36 34 30 30 34 2d 35 33 38 31 34 20 49 66  R-64004-53814 If
3050: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 46 46   there is no OFF
3060: 53 45 54 20 63 6c 61 75 73 65 2c 20 6f 72 20 74  SET clause, or t
3070: 68 65 0a 23 20 63 61 6c 63 75 6c 61 74 65 64 20  he.# calculated 
3080: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69 73  integer value is
3090: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 65   negative, the e
30a0: 66 66 65 63 74 69 76 65 20 4f 46 46 53 45 54 20  ffective OFFSET 
30b0: 76 61 6c 75 65 20 69 73 0a 23 20 7a 65 72 6f 2e  value is.# zero.
30c0: 0a 23 0a 64 6f 5f 64 65 6c 65 74 65 5f 74 65 73  .#.do_delete_tes
30d0: 74 73 20 65 5f 64 65 6c 65 74 65 2d 33 2e 36 20  ts e_delete-3.6 
30e0: 2d 72 65 70 61 69 72 20 72 65 62 75 69 6c 64 5f  -repair rebuild_
30f0: 74 31 20 2d 71 75 65 72 79 20 7b 0a 20 20 53 45  t1 -query {.  SE
3100: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 7d  LECT a FROM t1.}
3110: 20 7b 0a 20 20 31 61 20 20 22 44 45 4c 45 54 45   {.  1a  "DELETE
3120: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 33   FROM t1 LIMIT 3
3130: 20 4f 46 46 53 45 54 20 30 22 20 20 20 20 20 20   OFFSET 0"      
3140: 20 20 7b 34 20 35 7d 0a 20 20 31 62 20 20 22 44    {4 5}.  1b  "D
3150: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4c 49  ELETE FROM t1 LI
3160: 4d 49 54 20 33 22 20 20 20 20 20 20 20 20 20 20  MIT 3"          
3170: 20 20 20 20 20 20 20 7b 34 20 35 7d 0a 20 20 31         {4 5}.  1
3180: 63 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  c  "DELETE FROM 
3190: 74 31 20 4c 49 4d 49 54 20 33 20 4f 46 46 53 45  t1 LIMIT 3 OFFSE
31a0: 54 20 2d 31 22 20 20 20 20 20 20 20 7b 34 20 35  T -1"       {4 5
31b0: 7d 0a 20 20 32 61 20 20 22 44 45 4c 45 54 45 20  }.  2a  "DELETE 
31c0: 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 31 2b  FROM t1 LIMIT 1+
31d0: 31 20 4f 46 46 53 45 54 20 30 22 20 20 20 20 20  1 OFFSET 0"     
31e0: 20 7b 33 20 34 20 35 7d 0a 20 20 32 62 20 20 22   {3 4 5}.  2b  "
31f0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4c  DELETE FROM t1 L
3200: 49 4d 49 54 20 31 2b 31 22 20 20 20 20 20 20 20  IMIT 1+1"       
3210: 20 20 20 20 20 20 20 20 7b 33 20 34 20 35 7d 0a          {3 4 5}.
3220: 20 20 32 63 20 20 22 44 45 4c 45 54 45 20 46 52    2c  "DELETE FR
3230: 4f 4d 20 74 31 20 4c 49 4d 49 54 20 31 2b 31 20  OM t1 LIMIT 1+1 
3240: 4f 46 46 53 45 54 20 32 2d 35 22 20 20 20 20 7b  OFFSET 2-5"    {
3250: 33 20 34 20 35 7d 0a 20 20 33 61 20 20 22 44 45  3 4 5}.  3a  "DE
3260: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d  LETE FROM t1 LIM
3270: 49 54 20 27 34 27 20 4f 46 46 53 45 54 20 30 22  IT '4' OFFSET 0"
3280: 20 20 20 20 20 20 7b 35 7d 0a 20 20 33 62 20 20        {5}.  3b  
3290: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20  "DELETE FROM t1 
32a0: 4c 49 4d 49 54 20 27 34 27 22 20 20 20 20 20 20  LIMIT '4'"      
32b0: 20 20 20 20 20 20 20 20 20 7b 35 7d 0a 20 20 33           {5}.  3
32c0: 63 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  c  "DELETE FROM 
32d0: 74 31 20 4c 49 4d 49 54 20 27 34 27 20 4f 46 46  t1 LIMIT '4' OFF
32e0: 53 45 54 20 2d 31 2e 30 22 20 20 20 7b 35 7d 0a  SET -1.0"   {5}.
32f0: 20 20 34 61 20 20 22 44 45 4c 45 54 45 20 46 52    4a  "DELETE FR
3300: 4f 4d 20 74 31 20 4c 49 4d 49 54 20 27 31 2e 30  OM t1 LIMIT '1.0
3310: 27 20 4f 46 46 53 45 54 20 30 22 20 20 20 20 7b  ' OFFSET 0"    {
3320: 32 20 33 20 34 20 35 7d 0a 20 20 34 62 20 20 22  2 3 4 5}.  4b  "
3330: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4c  DELETE FROM t1 L
3340: 49 4d 49 54 20 27 31 2e 30 27 22 20 20 20 20 20  IMIT '1.0'"     
3350: 20 20 20 20 20 20 20 20 7b 32 20 33 20 34 20 35          {2 3 4 5
3360: 7d 0a 20 20 34 63 20 20 22 44 45 4c 45 54 45 20  }.  4c  "DELETE 
3370: 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 27 31  FROM t1 LIMIT '1
3380: 2e 30 27 20 4f 46 46 53 45 54 20 2d 31 31 22 20  .0' OFFSET -11" 
3390: 20 7b 32 20 33 20 34 20 35 7d 0a 7d 0a 0a 23 20   {2 3 4 5}.}..# 
33a0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
33b0: 38 31 34 31 2d 35 32 33 33 34 20 49 66 20 74 68  8141-52334 If th
33c0: 65 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  e DELETE stateme
33d0: 6e 74 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20  nt has an ORDER 
33e0: 42 59 0a 23 20 63 6c 61 75 73 65 2c 20 74 68 65  BY.# clause, the
33f0: 6e 20 61 6c 6c 20 72 6f 77 73 20 74 68 61 74 20  n all rows that 
3400: 77 6f 75 6c 64 20 62 65 20 64 65 6c 65 74 65 64  would be deleted
3410: 20 69 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   in the absence 
3420: 6f 66 20 74 68 65 0a 23 20 4c 49 4d 49 54 20 63  of the.# LIMIT c
3430: 6c 61 75 73 65 20 61 72 65 20 73 6f 72 74 65 64  lause are sorted
3440: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
3450: 65 20 4f 52 44 45 52 20 42 59 2e 20 54 68 65 20  e ORDER BY. The 
3460: 66 69 72 73 74 20 4d 20 72 6f 77 73 2c 0a 23 20  first M rows,.# 
3470: 77 68 65 72 65 20 4d 20 69 73 20 74 68 65 20 76  where M is the v
3480: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 65 76  alue found by ev
3490: 61 6c 75 61 74 69 6e 67 20 74 68 65 20 4f 46 46  aluating the OFF
34a0: 53 45 54 20 63 6c 61 75 73 65 20 65 78 70 72 65  SET clause expre
34b0: 73 73 69 6f 6e 2c 0a 23 20 61 72 65 20 73 6b 69  ssion,.# are ski
34c0: 70 70 65 64 2c 20 61 6e 64 20 74 68 65 20 66 6f  pped, and the fo
34d0: 6c 6c 6f 77 69 6e 67 20 4e 2c 20 77 68 65 72 65  llowing N, where
34e0: 20 4e 20 69 73 20 74 68 65 20 76 61 6c 75 65 20   N is the value 
34f0: 6f 66 20 74 68 65 20 4c 49 4d 49 54 0a 23 20 65  of the LIMIT.# e
3500: 78 70 72 65 73 73 69 6f 6e 2c 20 61 72 65 20 64  xpression, are d
3510: 65 6c 65 74 65 64 2e 0a 23 0a 64 6f 5f 64 65 6c  eleted..#.do_del
3520: 65 74 65 5f 74 65 73 74 73 20 65 5f 64 65 6c 65  ete_tests e_dele
3530: 74 65 2d 33 2e 37 20 2d 72 65 70 61 69 72 20 72  te-3.7 -repair r
3540: 65 62 75 69 6c 64 5f 74 31 20 2d 71 75 65 72 79  ebuild_t1 -query
3550: 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 20 46 52   {.  SELECT a FR
3560: 4f 4d 20 74 31 0a 7d 20 7b 0a 20 20 31 20 20 20  OM t1.} {.  1   
3570: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20  "DELETE FROM t1 
3580: 4f 52 44 45 52 20 42 59 20 62 20 4c 49 4d 49 54  ORDER BY b LIMIT
3590: 20 32 22 20 20 20 20 20 20 20 20 20 20 20 20 20   2"             
35a0: 20 20 7b 31 20 32 20 33 7d 0a 20 20 32 20 20 20    {1 2 3}.  2   
35b0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20  "DELETE FROM t1 
35c0: 4f 52 44 45 52 20 42 59 20 6c 65 6e 67 74 68 28  ORDER BY length(
35d0: 62 29 2c 20 61 20 4c 49 4d 49 54 20 33 22 20 20  b), a LIMIT 3"  
35e0: 20 20 7b 33 20 35 7d 0a 20 20 33 20 20 20 22 44    {3 5}.  3   "D
35f0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4f 52  ELETE FROM t1 OR
3600: 44 45 52 20 42 59 20 61 20 44 45 53 43 20 4c 49  DER BY a DESC LI
3610: 4d 49 54 20 31 20 4f 46 46 53 45 54 20 30 22 20  MIT 1 OFFSET 0" 
3620: 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 34 20 20   {1 2 3 4}.  4  
3630: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31   "DELETE FROM t1
3640: 20 4f 52 44 45 52 20 42 59 20 61 20 44 45 53 43   ORDER BY a DESC
3650: 20 4c 49 4d 49 54 20 31 20 4f 46 46 53 45 54 20   LIMIT 1 OFFSET 
3660: 31 22 20 20 7b 31 20 32 20 33 20 35 7d 0a 20 20  1"  {1 2 3 5}.  
3670: 35 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  5   "DELETE FROM
3680: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 20 44   t1 ORDER BY a D
3690: 45 53 43 20 4c 49 4d 49 54 20 31 20 4f 46 46 53  ESC LIMIT 1 OFFS
36a0: 45 54 20 32 22 20 20 7b 31 20 32 20 34 20 35 7d  ET 2"  {1 2 4 5}
36b0: 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .}..# EVIDENCE-O
36c0: 46 3a 20 52 2d 36 34 35 33 35 2d 30 38 34 31 34  F: R-64535-08414
36d0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   If there are le
36e0: 73 73 20 74 68 61 6e 20 4e 20 72 6f 77 73 20 72  ss than N rows r
36f0: 65 6d 61 69 6e 69 6e 67 0a 23 20 61 66 74 65 72  emaining.# after
3700: 20 74 61 6b 69 6e 67 20 74 68 65 20 4f 46 46 53   taking the OFFS
3710: 45 54 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61  ET clause into a
3720: 63 63 6f 75 6e 74 2c 20 6f 72 20 69 66 20 74 68  ccount, or if th
3730: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 0a 23  e LIMIT clause.#
3740: 20 65 76 61 6c 75 61 74 65 64 20 74 6f 20 61 20   evaluated to a 
3750: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 2c 20  negative value, 
3760: 74 68 65 6e 20 61 6c 6c 20 72 65 6d 61 69 6e 69  then all remaini
3770: 6e 67 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65  ng rows are dele
3780: 74 65 64 2e 0a 23 0a 64 6f 5f 64 65 6c 65 74 65  ted..#.do_delete
3790: 5f 74 65 73 74 73 20 65 5f 64 65 6c 65 74 65 2d  _tests e_delete-
37a0: 33 2e 38 20 2d 72 65 70 61 69 72 20 72 65 62 75  3.8 -repair rebu
37b0: 69 6c 64 5f 74 31 20 2d 71 75 65 72 79 20 7b 0a  ild_t1 -query {.
37c0: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
37d0: 74 31 0a 7d 20 7b 0a 20 20 31 20 20 20 22 44 45  t1.} {.  1   "DE
37e0: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4f 52 44  LETE FROM t1 ORD
37f0: 45 52 20 42 59 20 61 20 41 53 43 20 4c 49 4d 49  ER BY a ASC LIMI
3800: 54 20 31 30 22 20 20 20 20 20 20 20 20 20 20 20  T 10"           
3810: 7b 7d 0a 20 20 32 20 20 20 22 44 45 4c 45 54 45  {}.  2   "DELETE
3820: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
3830: 59 20 61 20 41 53 43 20 4c 49 4d 49 54 20 2d 31  Y a ASC LIMIT -1
3840: 22 20 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 20  "           {}. 
3850: 20 33 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f   3   "DELETE FRO
3860: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 20  M t1 ORDER BY a 
3870: 41 53 43 20 4c 49 4d 49 54 20 34 20 4f 46 46 53  ASC LIMIT 4 OFFS
3880: 45 54 20 32 22 20 20 20 7b 31 20 32 7d 0a 7d 0a  ET 2"   {1 2}.}.
3890: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
38a0: 52 2d 33 37 32 38 34 2d 30 36 39 36 35 20 49 66  R-37284-06965 If
38b0: 20 74 68 65 20 44 45 4c 45 54 45 20 73 74 61 74   the DELETE stat
38c0: 65 6d 65 6e 74 20 68 61 73 20 6e 6f 20 4f 52 44  ement has no ORD
38d0: 45 52 20 42 59 0a 23 20 63 6c 61 75 73 65 2c 20  ER BY.# clause, 
38e0: 74 68 65 6e 20 61 6c 6c 20 72 6f 77 73 20 74 68  then all rows th
38f0: 61 74 20 77 6f 75 6c 64 20 62 65 20 64 65 6c 65  at would be dele
3900: 74 65 64 20 69 6e 20 74 68 65 20 61 62 73 65 6e  ted in the absen
3910: 63 65 20 6f 66 20 74 68 65 0a 23 20 4c 49 4d 49  ce of the.# LIMI
3920: 54 20 63 6c 61 75 73 65 20 61 72 65 20 61 73 73  T clause are ass
3930: 65 6d 62 6c 65 64 20 69 6e 20 61 6e 20 61 72 62  embled in an arb
3940: 69 74 72 61 72 79 20 6f 72 64 65 72 20 62 65 66  itrary order bef
3950: 6f 72 65 20 61 70 70 6c 79 69 6e 67 20 74 68 65  ore applying the
3960: 0a 23 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  .# LIMIT and OFF
3970: 53 45 54 20 63 6c 61 75 73 65 73 20 74 6f 20 64  SET clauses to d
3980: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 75 62  etermine the sub
3990: 73 65 74 20 74 68 61 74 20 61 72 65 20 61 63 74  set that are act
39a0: 75 61 6c 6c 79 0a 23 20 64 65 6c 65 74 65 64 2e  ually.# deleted.
39b0: 0a 23 0a 23 20 20 20 20 20 49 6e 20 70 72 61 63  .#.#     In prac
39c0: 74 69 63 65 2c 20 74 68 65 20 22 61 72 62 69 74  tice, the "arbit
39d0: 72 61 72 79 20 6f 72 64 65 72 22 20 69 73 20 72  rary order" is r
39e0: 6f 77 69 64 20 6f 72 64 65 72 2e 0a 23 0a 64 6f  owid order..#.do
39f0: 5f 64 65 6c 65 74 65 5f 74 65 73 74 73 20 65 5f  _delete_tests e_
3a00: 64 65 6c 65 74 65 2d 33 2e 39 20 2d 72 65 70 61  delete-3.9 -repa
3a10: 69 72 20 72 65 62 75 69 6c 64 5f 74 31 20 2d 71  ir rebuild_t1 -q
3a20: 75 65 72 79 20 7b 0a 20 20 53 45 4c 45 43 54 20  uery {.  SELECT 
3a30: 61 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 0a 20 20  a FROM t1.} {.  
3a40: 31 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  1   "DELETE FROM
3a50: 20 74 31 20 4c 49 4d 49 54 20 32 22 20 20 20 20   t1 LIMIT 2"    
3a60: 20 20 20 20 20 20 20 20 20 20 20 7b 33 20 34 20             {3 4 
3a70: 35 7d 0a 20 20 32 20 20 20 22 44 45 4c 45 54 45  5}.  2   "DELETE
3a80: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 33   FROM t1 LIMIT 3
3a90: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
3aa0: 7b 34 20 35 7d 0a 20 20 33 20 20 20 22 44 45 4c  {4 5}.  3   "DEL
3ab0: 45 54 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49  ETE FROM t1 LIMI
3ac0: 54 20 31 20 4f 46 46 53 45 54 20 30 22 20 20 20  T 1 OFFSET 0"   
3ad0: 20 20 20 7b 32 20 33 20 34 20 35 7d 0a 20 20 34     {2 3 4 5}.  4
3ae0: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
3af0: 74 31 20 4c 49 4d 49 54 20 31 20 4f 46 46 53 45  t1 LIMIT 1 OFFSE
3b00: 54 20 31 22 20 20 20 20 20 20 7b 31 20 33 20 34  T 1"      {1 3 4
3b10: 20 35 7d 0a 20 20 35 20 20 20 22 44 45 4c 45 54   5}.  5   "DELET
3b20: 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20  E FROM t1 LIMIT 
3b30: 31 20 4f 46 46 53 45 54 20 32 22 20 20 20 20 20  1 OFFSET 2"     
3b40: 20 7b 31 20 32 20 34 20 35 7d 0a 7d 0a 0a 0a 23   {1 2 4 5}.}...#
3b50: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
3b60: 30 37 35 34 38 2d 31 33 34 32 32 20 54 68 65 20  07548-13422 The 
3b70: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
3b80: 6f 6e 20 61 20 44 45 4c 45 54 45 20 73 74 61 74  on a DELETE stat
3b90: 65 6d 65 6e 74 0a 23 20 69 73 20 75 73 65 64 20  ement.# is used 
3ba0: 6f 6e 6c 79 20 74 6f 20 64 65 74 65 72 6d 69 6e  only to determin
3bb0: 65 20 77 68 69 63 68 20 72 6f 77 73 20 66 61 6c  e which rows fal
3bc0: 6c 20 77 69 74 68 69 6e 20 74 68 65 20 4c 49 4d  l within the LIM
3bd0: 49 54 2e 20 54 68 65 20 6f 72 64 65 72 0a 23 20  IT. The order.# 
3be0: 69 6e 20 77 68 69 63 68 20 72 6f 77 73 20 61 72  in which rows ar
3bf0: 65 20 64 65 6c 65 74 65 64 20 69 73 20 61 72 62  e deleted is arb
3c00: 69 74 72 61 72 79 20 61 6e 64 20 69 73 20 6e 6f  itrary and is no
3c10: 74 20 69 6e 66 6c 75 65 6e 63 65 64 20 62 79 20  t influenced by 
3c20: 74 68 65 0a 23 20 4f 52 44 45 52 20 42 59 20 63  the.# ORDER BY c
3c30: 6c 61 75 73 65 2e 0a 23 0a 23 20 20 20 20 20 49  lause..#.#     I
3c40: 6e 20 70 72 61 63 74 69 63 65 2c 20 72 6f 77 73  n practice, rows
3c50: 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 6c 65   are always dele
3c60: 74 65 64 20 69 6e 20 72 6f 77 69 64 20 6f 72 64  ted in rowid ord
3c70: 65 72 2e 0a 23 0a 64 6f 5f 64 65 6c 65 74 65 5f  er..#.do_delete_
3c80: 74 65 73 74 73 20 65 5f 64 65 6c 65 74 65 2d 33  tests e_delete-3
3c90: 2e 31 30 20 2d 72 65 70 61 69 72 20 7b 0a 20 20  .10 -repair {.  
3ca0: 72 65 62 75 69 6c 64 5f 74 31 20 0a 20 20 63 61  rebuild_t1 .  ca
3cb0: 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20 54 41  tchsql { DROP TA
3cc0: 42 4c 45 20 74 31 6c 6f 67 20 7d 0a 20 20 65 78  BLE t1log }.  ex
3cd0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
3ce0: 54 45 20 54 41 42 4c 45 20 74 31 6c 6f 67 28 78  TE TABLE t1log(x
3cf0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52  );.    CREATE TR
3d00: 49 47 47 45 52 20 74 72 31 20 41 46 54 45 52 20  IGGER tr1 AFTER 
3d10: 44 45 4c 45 54 45 20 4f 4e 20 74 31 20 42 45 47  DELETE ON t1 BEG
3d20: 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  IN.      INSERT 
3d30: 49 4e 54 4f 20 74 31 6c 6f 67 20 56 41 4c 55 45  INTO t1log VALUE
3d40: 53 28 6f 6c 64 2e 61 29 3b 0a 20 20 20 20 45 4e  S(old.a);.    EN
3d50: 44 3b 0a 20 20 7d 0a 7d 20 2d 71 75 65 72 79 20  D;.  }.} -query 
3d60: 7b 0a 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f  {.  SELECT x FRO
3d70: 4d 20 74 31 6c 6f 67 0a 7d 20 7b 0a 20 20 31 20  M t1log.} {.  1 
3d80: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74    "DELETE FROM t
3d90: 31 20 4f 52 44 45 52 20 42 59 20 61 20 44 45 53  1 ORDER BY a DES
3da0: 43 20 4c 49 4d 49 54 20 32 22 20 20 20 7b 34 20  C LIMIT 2"   {4 
3db0: 35 7d 0a 20 20 32 20 20 20 22 44 45 4c 45 54 45  5}.  2   "DELETE
3dc0: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
3dd0: 59 20 61 20 44 45 53 43 20 4c 49 4d 49 54 20 2d  Y a DESC LIMIT -
3de0: 31 22 20 20 7b 31 20 32 20 33 20 34 20 35 7d 0a  1"  {1 2 3 4 5}.
3df0: 20 20 33 20 20 20 22 44 45 4c 45 54 45 20 46 52    3   "DELETE FR
3e00: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61  OM t1 ORDER BY a
3e10: 20 41 53 43 20 4c 49 4d 49 54 20 32 22 20 20 20   ASC LIMIT 2"   
3e20: 20 7b 31 20 32 7d 0a 20 20 34 20 20 20 22 44 45   {1 2}.  4   "DE
3e30: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4f 52 44  LETE FROM t1 ORD
3e40: 45 52 20 42 59 20 61 20 41 53 43 20 4c 49 4d 49  ER BY a ASC LIMI
3e50: 54 20 2d 31 22 20 20 20 7b 31 20 32 20 33 20 34  T -1"   {1 2 3 4
3e60: 20 35 7d 0a 7d 0a 0a 7d 0a 20 0a 66 69 6e 69 73   5}.}..}. .finis
3e70: 68 5f 74 65 73 74 0a                             h_test.