/ Hex Artifact Content
Login

Artifact e2ae0d3fce5efd70fef99025e932afffc5616fab:


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 70 72 6f 63 20 64 6f 5f 64 65 6c 65 74  l..proc do_delet
0230: 65 5f 74 65 73 74 73 20 7b 61 72 67 73 7d 20 7b  e_tests {args} {
0240: 0a 20 20 75 70 6c 65 76 65 6c 20 64 6f 5f 73 65  .  uplevel do_se
0250: 6c 65 63 74 5f 74 65 73 74 73 20 24 61 72 67 73  lect_tests $args
0260: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
0270: 65 73 74 20 65 5f 64 65 6c 65 74 65 2d 30 2e 30  est e_delete-0.0
0280: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
0290: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 43 52  E t1(a, b);.  CR
02a0: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
02b0: 20 74 31 28 61 29 3b 0a 7d 20 7b 7d 0a 0a 23 20   t1(a);.} {}..# 
02c0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
02d0: 34 31 37 37 2d 35 32 38 38 33 20 2d 2d 20 73 79  4177-52883 -- sy
02e0: 6e 74 61 78 20 64 69 61 67 72 61 6d 20 64 65 6c  ntax diagram del
02f0: 65 74 65 2d 73 74 6d 74 0a 23 0a 23 20 45 56 49  ete-stmt.#.# EVI
0300: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 38 30  DENCE-OF: R-1280
0310: 32 2d 36 30 34 36 34 20 2d 2d 20 73 79 6e 74 61  2-60464 -- synta
0320: 78 20 64 69 61 67 72 61 6d 20 71 75 61 6c 69 66  x diagram qualif
0330: 69 65 64 2d 74 61 62 6c 65 2d 6e 61 6d 65 0a 23  ied-table-name.#
0340: 0a 64 6f 5f 64 65 6c 65 74 65 5f 74 65 73 74 73  .do_delete_tests
0350: 20 65 5f 64 65 6c 65 74 65 2d 30 2e 31 20 7b 0a   e_delete-0.1 {.
0360: 20 20 31 20 20 22 44 45 4c 45 54 45 20 46 52 4f    1  "DELETE FRO
0370: 4d 20 74 31 22 20 20 20 20 20 20 20 20 20 20 20  M t1"           
0380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0390: 20 20 20 7b 7d 0a 20 20 32 20 20 22 44 45 4c 45     {}.  2  "DELE
03a0: 54 45 20 46 52 4f 4d 20 74 31 20 49 4e 44 45 58  TE FROM t1 INDEX
03b0: 45 44 20 42 59 20 69 31 22 20 20 20 20 20 20 20  ED BY i1"       
03c0: 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20 33 20           {}.  3 
03d0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31   "DELETE FROM t1
03e0: 20 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 20 20   NOT INDEXED"   
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
0400: 7d 0a 20 20 34 20 20 22 44 45 4c 45 54 45 20 46  }.  4  "DELETE F
0410: 52 4f 4d 20 6d 61 69 6e 2e 74 31 22 20 20 20 20  ROM main.t1"    
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0430: 20 20 20 20 20 7b 7d 0a 20 20 35 20 20 22 44 45       {}.  5  "DE
0440: 4c 45 54 45 20 46 52 4f 4d 20 6d 61 69 6e 2e 74  LETE FROM main.t
0450: 31 20 49 4e 44 45 58 45 44 20 42 59 20 69 31 22  1 INDEXED BY i1"
0460: 20 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20             {}.  
0470: 36 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  6  "DELETE FROM 
0480: 6d 61 69 6e 2e 74 31 20 4e 4f 54 20 49 4e 44 45  main.t1 NOT INDE
0490: 58 45 44 22 20 20 20 20 20 20 20 20 20 20 20 20  XED"            
04a0: 20 7b 7d 0a 20 20 37 20 20 22 44 45 4c 45 54 45   {}.  7  "DELETE
04b0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
04c0: 3e 32 22 20 20 20 20 20 20 20 20 20 20 20 20 20  >2"             
04d0: 20 20 20 20 20 20 20 7b 7d 0a 20 20 38 20 20 22         {}.  8  "
04e0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 49  DELETE FROM t1 I
04f0: 4e 44 45 58 45 44 20 42 59 20 69 31 20 57 48 45  NDEXED BY i1 WHE
0500: 52 45 20 61 3e 32 22 20 20 20 20 20 20 7b 7d 0a  RE a>2"      {}.
0510: 20 20 39 20 20 22 44 45 4c 45 54 45 20 46 52 4f    9  "DELETE FRO
0520: 4d 20 74 31 20 4e 4f 54 20 49 4e 44 45 58 45 44  M t1 NOT INDEXED
0530: 20 57 48 45 52 45 20 61 3e 32 22 20 20 20 20 20   WHERE a>2"     
0540: 20 20 20 7b 7d 0a 20 20 31 30 20 22 44 45 4c 45     {}.  10 "DELE
0550: 54 45 20 46 52 4f 4d 20 6d 61 69 6e 2e 74 31 20  TE FROM main.t1 
0560: 57 48 45 52 45 20 61 3e 32 22 20 20 20 20 20 20  WHERE a>2"      
0570: 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20 31 31           {}.  11
0580: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 6d 61   "DELETE FROM ma
0590: 69 6e 2e 74 31 20 49 4e 44 45 58 45 44 20 42 59  in.t1 INDEXED BY
05a0: 20 69 31 20 57 48 45 52 45 20 61 3e 32 22 20 7b   i1 WHERE a>2" {
05b0: 7d 0a 20 20 31 32 20 22 44 45 4c 45 54 45 20 46  }.  12 "DELETE F
05c0: 52 4f 4d 20 6d 61 69 6e 2e 74 31 20 4e 4f 54 20  ROM main.t1 NOT 
05d0: 49 4e 44 45 58 45 44 20 57 48 45 52 45 20 61 3e  INDEXED WHERE a>
05e0: 32 22 20 20 20 7b 7d 0a 7d 0a 0a 23 20 45 56 49  2"   {}.}..# EVI
05f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 32 30  DENCE-OF: R-2020
0600: 35 2d 31 37 33 34 39 20 49 66 20 74 68 65 20 57  5-17349 If the W
0610: 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 6e  HERE clause is n
0620: 6f 74 20 70 72 65 73 65 6e 74 2c 20 61 6c 6c 0a  ot present, all.
0630: 23 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  # records in the
0640: 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74   table are delet
0650: 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  ed..#.drop_all_t
0660: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
0670: 64 65 6c 65 74 65 2d 31 2e 30 20 7b 0a 20 20 64  delete-1.0 {.  d
0680: 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a  b transaction {.
0690: 20 20 20 20 66 6f 72 65 61 63 68 20 74 20 7b 74      foreach t {t
06a0: 31 20 74 32 20 74 33 20 74 34 20 74 35 20 74 36  1 t2 t3 t4 t5 t6
06b0: 7d 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71  } {.      execsq
06c0: 6c 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c  l [string map [l
06d0: 69 73 74 20 25 54 25 20 24 74 5d 20 7b 0a 20 20  ist %T% $t] {.  
06e0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
06f0: 4c 45 20 25 54 25 28 78 2c 20 79 29 3b 0a 20 20  LE %T%(x, y);.  
0700: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0710: 4f 20 25 54 25 20 56 41 4c 55 45 53 28 31 2c 20  O %T% VALUES(1, 
0720: 27 6f 6e 65 27 29 3b 0a 20 20 20 20 20 20 20 20  'one');.        
0730: 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 54 25 20  INSERT INTO %T% 
0740: 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27 29  VALUES(2, 'two')
0750: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
0760: 20 49 4e 54 4f 20 25 54 25 20 56 41 4c 55 45 53   INTO %T% VALUES
0770: 28 33 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20  (3, 'three');.  
0780: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0790: 4f 20 25 54 25 20 56 41 4c 55 45 53 28 34 2c 20  O %T% VALUES(4, 
07a0: 27 66 6f 75 72 27 29 3b 0a 20 20 20 20 20 20 20  'four');.       
07b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 54 25   INSERT INTO %T%
07c0: 20 56 41 4c 55 45 53 28 35 2c 20 27 66 69 76 65   VALUES(5, 'five
07d0: 27 29 3b 0a 20 20 20 20 20 20 7d 5d 0a 20 20 20  ');.      }].   
07e0: 20 7d 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 64   }.  }.} {}.do_d
07f0: 65 6c 65 74 65 5f 74 65 73 74 73 20 65 5f 64 65  elete_tests e_de
0800: 6c 65 74 65 2d 31 2e 31 20 7b 0a 20 20 31 20 20  lete-1.1 {.  1  
0810: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20  "DELETE FROM t1 
0820: 20 20 20 20 20 20 3b 20 53 45 4c 45 43 54 20 2a        ; SELECT *
0830: 20 46 52 4f 4d 20 74 31 22 20 20 20 20 20 20 20   FROM t1"       
0840: 7b 7d 0a 20 20 32 20 20 22 44 45 4c 45 54 45 20  {}.  2  "DELETE 
0850: 46 52 4f 4d 20 6d 61 69 6e 2e 74 32 20 20 3b 20  FROM main.t2  ; 
0860: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
0870: 22 20 20 20 20 20 20 20 7b 7d 0a 7d 0a 0a 23 20  "       {}.}..# 
0880: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
0890: 30 32 30 33 2d 31 36 31 37 37 20 49 66 20 61 20  0203-16177 If a 
08a0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
08b0: 73 75 70 70 6c 69 65 64 2c 20 74 68 65 6e 20 6f  supplied, then o
08c0: 6e 6c 79 0a 23 20 74 68 6f 73 65 20 72 6f 77 73  nly.# those rows
08d0: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 72   for which the r
08e0: 65 73 75 6c 74 20 6f 66 20 65 76 61 6c 75 61 74  esult of evaluat
08f0: 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63 6c  ing the WHERE cl
0900: 61 75 73 65 20 61 73 20 61 0a 23 20 62 6f 6f 6c  ause as a.# bool
0910: 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ean expression i
0920: 73 20 74 72 75 65 20 61 72 65 20 64 65 6c 65 74  s true are delet
0930: 65 64 2e 0a 23 0a 64 6f 5f 64 65 6c 65 74 65 5f  ed..#.do_delete_
0940: 74 65 73 74 73 20 65 5f 64 65 6c 65 74 65 2d 31  tests e_delete-1
0950: 2e 32 20 7b 0a 20 20 31 20 20 22 44 45 4c 45 54  .2 {.  1  "DELET
0960: 45 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20  E FROM t3 WHERE 
0970: 31 20 20 20 20 20 20 20 3b 20 53 45 4c 45 43 54  1       ; SELECT
0980: 20 78 20 46 52 4f 4d 20 74 33 22 20 20 20 20 20   x FROM t3"     
0990: 20 20 7b 7d 0a 20 20 32 20 20 22 44 45 4c 45 54    {}.  2  "DELET
09a0: 45 20 46 52 4f 4d 20 6d 61 69 6e 2e 74 34 20 57  E FROM main.t4 W
09b0: 48 45 52 45 20 30 20 20 3b 20 53 45 4c 45 43 54  HERE 0  ; SELECT
09c0: 20 78 20 46 52 4f 4d 20 74 34 22 20 20 20 20 20   x FROM t4"     
09d0: 20 20 7b 31 20 32 20 33 20 34 20 35 7d 0a 20 20    {1 2 3 4 5}.  
09e0: 33 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  3  "DELETE FROM 
09f0: 74 34 20 57 48 45 52 45 20 30 2e 30 20 20 20 20  t4 WHERE 0.0    
0a00: 20 3b 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d   ; SELECT x FROM
0a10: 20 74 34 22 20 20 20 20 20 20 20 7b 31 20 32 20   t4"       {1 2 
0a20: 33 20 34 20 35 7d 0a 20 20 34 20 20 22 44 45 4c  3 4 5}.  4  "DEL
0a30: 45 54 45 20 46 52 4f 4d 20 74 34 20 57 48 45 52  ETE FROM t4 WHER
0a40: 45 20 4e 55 4c 4c 20 20 20 20 3b 20 53 45 4c 45  E NULL    ; SELE
0a50: 43 54 20 78 20 46 52 4f 4d 20 74 34 22 20 20 20  CT x FROM t4"   
0a60: 20 20 20 20 7b 31 20 32 20 33 20 34 20 35 7d 0a      {1 2 3 4 5}.
0a70: 20 20 35 20 20 22 44 45 4c 45 54 45 20 46 52 4f    5  "DELETE FRO
0a80: 4d 20 74 34 20 57 48 45 52 45 20 79 21 3d 27 74  M t4 WHERE y!='t
0a90: 77 6f 27 3b 20 53 45 4c 45 43 54 20 78 20 46 52  wo'; SELECT x FR
0aa0: 4f 4d 20 74 34 22 20 20 20 20 20 20 20 7b 32 7d  OM t4"       {2}
0ab0: 0a 20 20 36 20 20 22 44 45 4c 45 54 45 20 46 52  .  6  "DELETE FR
0ac0: 4f 4d 20 74 34 20 57 48 45 52 45 20 79 3d 27 74  OM t4 WHERE y='t
0ad0: 77 6f 27 20 3b 20 53 45 4c 45 43 54 20 78 20 46  wo' ; SELECT x F
0ae0: 52 4f 4d 20 74 34 22 20 20 20 20 20 20 20 7b 7d  ROM t4"       {}
0af0: 0a 20 20 37 20 20 22 44 45 4c 45 54 45 20 46 52  .  7  "DELETE FR
0b00: 4f 4d 20 74 35 20 57 48 45 52 45 20 78 3d 28 53  OM t5 WHERE x=(S
0b10: 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
0b20: 4d 20 74 35 29 3b 53 45 4c 45 43 54 20 78 20 46  M t5);SELECT x F
0b30: 52 4f 4d 20 74 35 22 20 7b 31 20 32 20 33 20 34  ROM t5" {1 2 3 4
0b40: 7d 0a 20 20 38 20 20 22 44 45 4c 45 54 45 20 46  }.  8  "DELETE F
0b50: 52 4f 4d 20 74 35 20 57 48 45 52 45 20 28 53 45  ROM t5 WHERE (SE
0b60: 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d  LECT max(x) FROM
0b70: 20 74 34 29 20 20 3b 53 45 4c 45 43 54 20 78 20   t4)  ;SELECT x 
0b80: 46 52 4f 4d 20 74 35 22 20 7b 31 20 32 20 33 20  FROM t5" {1 2 3 
0b90: 34 7d 0a 20 20 39 20 20 22 44 45 4c 45 54 45 20  4}.  9  "DELETE 
0ba0: 46 52 4f 4d 20 74 35 20 57 48 45 52 45 20 28 53  FROM t5 WHERE (S
0bb0: 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
0bc0: 4d 20 74 36 29 20 20 3b 53 45 4c 45 43 54 20 78  M t6)  ;SELECT x
0bd0: 20 46 52 4f 4d 20 74 35 22 20 7b 7d 0a 20 20 31   FROM t5" {}.  1
0be0: 30 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  0 "DELETE FROM t
0bf0: 36 20 57 48 45 52 45 20 79 3e 27 73 65 76 65 6e  6 WHERE y>'seven
0c00: 27 20 3b 20 53 45 4c 45 43 54 20 79 20 46 52 4f  ' ; SELECT y FRO
0c10: 4d 20 74 36 22 20 20 20 20 20 7b 6f 6e 65 20 66  M t6"     {one f
0c20: 6f 75 72 20 66 69 76 65 7d 0a 7d 0a 0a 0a 23 2d  our five}.}...#-
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: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73  --------.# Tests
0c80: 20 66 6f 72 20 72 65 73 74 72 69 63 74 69 6f 6e   for restriction
0c90: 73 20 6f 6e 20 44 45 4c 45 54 45 20 73 74 61 74  s on DELETE stat
0ca0: 65 6d 65 6e 74 73 20 74 68 61 74 20 61 70 70 65  ements that appe
0cb0: 61 72 20 77 69 74 68 69 6e 20 74 72 69 67 67 65  ar within trigge
0cc0: 72 0a 23 20 70 72 6f 67 72 61 6d 73 2e 0a 23 0a  r.# programs..#.
0cd0: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
0ce0: 2e 64 62 32 0a 66 6f 72 63 65 64 65 6c 65 74 65  .db2.forcedelete
0cf0: 20 74 65 73 74 2e 64 62 33 0a 64 6f 5f 65 78 65   test.db3.do_exe
0d00: 63 73 71 6c 5f 74 65 73 74 20 65 5f 64 65 6c 65  csql_test e_dele
0d10: 74 65 2d 32 2e 30 20 7b 0a 20 20 41 54 54 41 43  te-2.0 {.  ATTAC
0d20: 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20  H 'test.db2' AS 
0d30: 61 75 78 3b 0a 20 20 41 54 54 41 43 48 20 27 74  aux;.  ATTACH 't
0d40: 65 73 74 2e 64 62 33 27 20 41 53 20 61 75 78 32  est.db3' AS aux2
0d50: 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  ;..  CREATE TABL
0d60: 45 20 74 65 6d 70 2e 74 37 28 61 2c 20 62 29 3b  E temp.t7(a, b);
0d70: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0d80: 65 6d 70 2e 74 37 20 56 41 4c 55 45 53 28 31 2c  emp.t7 VALUES(1,
0d90: 20 32 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41   2);.  CREATE TA
0da0: 42 4c 45 20 6d 61 69 6e 2e 74 37 28 61 2c 20 62  BLE main.t7(a, b
0db0: 29 3b 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );   INSERT INTO
0dc0: 20 6d 61 69 6e 2e 74 37 20 56 41 4c 55 45 53 28   main.t7 VALUES(
0dd0: 33 2c 20 34 29 3b 0a 20 20 43 52 45 41 54 45 20  3, 4);.  CREATE 
0de0: 54 41 42 4c 45 20 61 75 78 2e 74 37 28 61 2c 20  TABLE aux.t7(a, 
0df0: 62 29 3b 20 20 20 20 49 4e 53 45 52 54 20 49 4e  b);    INSERT IN
0e00: 54 4f 20 61 75 78 2e 74 37 20 56 41 4c 55 45 53  TO aux.t7 VALUES
0e10: 28 35 2c 20 36 29 3b 0a 20 20 43 52 45 41 54 45  (5, 6);.  CREATE
0e20: 20 54 41 42 4c 45 20 61 75 78 32 2e 74 37 28 61   TABLE aux2.t7(a
0e30: 2c 20 62 29 3b 20 20 20 49 4e 53 45 52 54 20 49  , b);   INSERT I
0e40: 4e 54 4f 20 61 75 78 32 2e 74 37 20 56 41 4c 55  NTO aux2.t7 VALU
0e50: 45 53 28 37 2c 20 38 29 3b 0a 0a 20 20 43 52 45  ES(7, 8);..  CRE
0e60: 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 74  ATE TABLE main.t
0e70: 38 28 61 2c 20 62 29 3b 20 20 20 49 4e 53 45 52  8(a, b);   INSER
0e80: 54 20 49 4e 54 4f 20 6d 61 69 6e 2e 74 38 20 56  T INTO main.t8 V
0e90: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 43  ALUES(1, 2);.  C
0ea0: 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e  REATE TABLE aux.
0eb0: 74 38 28 61 2c 20 62 29 3b 20 20 20 20 49 4e 53  t8(a, b);    INS
0ec0: 45 52 54 20 49 4e 54 4f 20 61 75 78 2e 74 38 20  ERT INTO aux.t8 
0ed0: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
0ee0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78  CREATE TABLE aux
0ef0: 32 2e 74 38 28 61 2c 20 62 29 3b 20 20 20 49 4e  2.t8(a, b);   IN
0f00: 53 45 52 54 20 49 4e 54 4f 20 61 75 78 32 2e 74  SERT INTO aux2.t
0f10: 38 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a  8 VALUES(5, 6);.
0f20: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
0f30: 61 75 78 2e 74 39 28 61 2c 20 62 29 3b 20 20 20  aux.t9(a, b);   
0f40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 75 78   INSERT INTO aux
0f50: 2e 74 39 20 56 41 4c 55 45 53 28 31 2c 20 32 29  .t9 VALUES(1, 2)
0f60: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
0f70: 20 61 75 78 32 2e 74 39 28 61 2c 20 62 29 3b 20   aux2.t9(a, b); 
0f80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 75    INSERT INTO au
0f90: 78 32 2e 74 39 20 56 41 4c 55 45 53 28 33 2c 20  x2.t9 VALUES(3, 
0fa0: 34 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41  4);..  CREATE TA
0fb0: 42 4c 45 20 61 75 78 32 2e 74 31 30 28 61 2c 20  BLE aux2.t10(a, 
0fc0: 62 29 3b 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  b);  INSERT INTO
0fd0: 20 61 75 78 32 2e 74 31 30 20 56 41 4c 55 45 53   aux2.t10 VALUES
0fe0: 28 31 2c 20 32 29 3b 0a 7d 20 7b 7d 0a 0a 0a 23  (1, 2);.} {}...#
0ff0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1000: 30 39 36 38 31 2d 35 38 35 36 30 20 54 68 65 20  09681-58560 The 
1010: 74 61 62 6c 65 2d 6e 61 6d 65 20 73 70 65 63 69  table-name speci
1020: 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  fied as part of 
1030: 61 0a 23 20 44 45 4c 45 54 45 20 73 74 61 74 65  a.# DELETE state
1040: 6d 65 6e 74 20 77 69 74 68 69 6e 20 61 20 74 72  ment within a tr
1050: 69 67 67 65 72 20 62 6f 64 79 20 6d 75 73 74 20  igger body must 
1060: 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 2e 0a  be unqualified..
1070: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
1080: 20 52 2d 33 36 37 37 31 2d 34 33 37 38 38 20 49   R-36771-43788 I
1090: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
10a0: 68 65 20 64 61 74 61 62 61 73 65 2d 6e 61 6d 65  he database-name
10b0: 2e 20 70 72 65 66 69 78 0a 23 20 6f 6e 20 74 68  . prefix.# on th
10c0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
10d0: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77 69 74 68  not allowed with
10e0: 69 6e 20 74 72 69 67 67 65 72 73 2e 0a 23 0a 64  in triggers..#.d
10f0: 6f 5f 64 65 6c 65 74 65 5f 74 65 73 74 73 20 65  o_delete_tests e
1100: 5f 64 65 6c 65 74 65 2d 32 2e 31 20 2d 65 72 72  _delete-2.1 -err
1110: 6f 72 20 7b 0a 20 20 71 75 61 6c 69 66 69 65 64  or {.  qualified
1120: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65   table names are
1130: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   not allowed on 
1140: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
1150: 61 6e 64 20 44 45 4c 45 54 45 20 73 74 61 74 65  and DELETE state
1160: 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69  ments within tri
1170: 67 67 65 72 73 0a 7d 20 7b 0a 20 20 31 20 7b 0a  ggers.} {.  1 {.
1180: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49        CREATE TRI
1190: 47 47 45 52 20 74 72 31 20 41 46 54 45 52 20 49  GGER tr1 AFTER I
11a0: 4e 53 45 52 54 20 4f 4e 20 74 31 20 42 45 47 49  NSERT ON t1 BEGI
11b0: 4e 0a 20 20 20 20 20 20 20 20 44 45 4c 45 54 45  N.        DELETE
11c0: 20 46 52 4f 4d 20 6d 61 69 6e 2e 74 32 3b 0a 20   FROM main.t2;. 
11d0: 20 20 20 20 20 45 4e 44 3b 0a 20 20 7d 20 7b 7d       END;.  } {}
11e0: 0a 0a 20 20 32 20 7b 0a 20 20 20 20 20 20 43 52  ..  2 {.      CR
11f0: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 31  EATE TRIGGER tr1
1200: 20 42 45 46 4f 52 45 20 55 50 44 41 54 45 20 4f   BEFORE UPDATE O
1210: 4e 20 74 32 20 42 45 47 49 4e 0a 20 20 20 20 20  N t2 BEGIN.     
1220: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
1230: 65 6d 70 2e 74 37 20 57 48 45 52 45 20 61 3d 6e  emp.t7 WHERE a=n
1240: 65 77 2e 61 3b 0a 20 20 20 20 20 20 45 4e 44 3b  ew.a;.      END;
1250: 0a 20 20 7d 20 7b 7d 0a 0a 20 20 33 20 7b 0a 20  .  } {}..  3 {. 
1260: 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47       CREATE TRIG
1270: 47 45 52 20 74 72 31 20 41 46 54 45 52 20 55 50  GER tr1 AFTER UP
1280: 44 41 54 45 20 4f 4e 20 74 38 20 42 45 47 49 4e  DATE ON t8 BEGIN
1290: 0a 20 20 20 20 20 20 20 20 44 45 4c 45 54 45 20  .        DELETE 
12a0: 46 52 4f 4d 20 61 75 78 32 2e 74 38 20 57 48 45  FROM aux2.t8 WHE
12b0: 52 45 20 62 21 3d 61 3b 0a 20 20 20 20 20 20 45  RE b!=a;.      E
12c0: 4e 44 3b 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 20  ND;.  } {}.}..# 
12d0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
12e0: 38 38 31 38 2d 36 33 35 32 36 20 49 66 20 74 68  8818-63526 If th
12f0: 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68  e table to which
1300: 20 74 68 65 20 74 72 69 67 67 65 72 20 69 73 0a   the trigger is.
1310: 23 20 61 74 74 61 63 68 65 64 20 69 73 20 6e 6f  # attached is no
1320: 74 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61  t in the temp da
1330: 74 61 62 61 73 65 2c 20 74 68 65 6e 20 44 45 4c  tabase, then DEL
1340: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 77  ETE statements w
1350: 69 74 68 69 6e 0a 23 20 74 68 65 20 74 72 69 67  ithin.# the trig
1360: 67 65 72 20 62 6f 64 79 20 6d 75 73 74 20 6f 70  ger body must op
1370: 65 72 61 74 65 20 6f 6e 20 74 61 62 6c 65 73 20  erate on tables 
1380: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
1390: 64 61 74 61 62 61 73 65 20 61 73 0a 23 20 69 74  database as.# it
13a0: 2e 0a 23 20 0a 23 20 20 20 54 68 69 73 20 69 73  ..# .#   This is
13b0: 20 74 65 73 74 65 64 20 69 6e 20 74 77 6f 20 70   tested in two p
13c0: 61 72 74 73 2e 20 46 69 72 73 74 2c 20 63 68 65  arts. First, che
13d0: 63 6b 20 74 68 61 74 20 69 66 20 61 20 74 61 62  ck that if a tab
13e0: 6c 65 20 6f 66 20 74 68 65 0a 23 20 20 20 73 70  le of the.#   sp
13f0: 65 63 69 66 69 65 64 20 6e 61 6d 65 20 64 6f 65  ecified name doe
1400: 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 61 6e 20  s not exist, an 
1410: 65 72 72 6f 72 20 69 73 20 72 61 69 73 65 64 2e  error is raised.
1420: 20 53 65 63 6f 6e 64 6c 79 2c 20 74 65 73 74 0a   Secondly, test.
1430: 23 20 20 20 74 68 61 74 20 69 66 20 74 61 62 6c  #   that if tabl
1440: 65 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63  es with the spec
1450: 69 66 69 65 64 20 6e 61 6d 65 20 65 78 69 73 74  ified name exist
1460: 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 64 61 74   in multiple dat
1470: 61 62 61 73 65 73 2c 0a 23 20 20 20 74 68 65 20  abases,.#   the 
1480: 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 74  local database t
1490: 61 62 6c 65 20 69 73 20 75 73 65 64 2e 0a 23 0a  able is used..#.
14a0: 64 6f 5f 64 65 6c 65 74 65 5f 74 65 73 74 73 20  do_delete_tests 
14b0: 65 5f 64 65 6c 65 74 65 2d 32 2e 32 2e 31 20 2d  e_delete-2.2.1 -
14c0: 65 72 72 6f 72 20 7b 20 6e 6f 20 73 75 63 68 20  error { no such 
14d0: 74 61 62 6c 65 3a 20 25 73 20 7d 20 7b 0a 20 20  table: %s } {.  
14e0: 31 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45  1 {.      CREATE
14f0: 20 54 52 49 47 47 45 52 20 6d 61 69 6e 2e 74 72   TRIGGER main.tr
1500: 31 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  1 AFTER INSERT O
1510: 4e 20 6d 61 69 6e 2e 74 37 20 42 45 47 49 4e 0a  N main.t7 BEGIN.
1520: 20 20 20 20 20 20 20 20 44 45 4c 45 54 45 20 46          DELETE F
1530: 52 4f 4d 20 74 39 3b 0a 20 20 20 20 20 20 45 4e  ROM t9;.      EN
1540: 44 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  D;.      INSERT 
1550: 49 4e 54 4f 20 6d 61 69 6e 2e 74 37 20 56 41 4c  INTO main.t7 VAL
1560: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 20 7b  UES(1, 2);.  } {
1570: 6d 61 69 6e 2e 74 39 7d 0a 0a 20 20 32 20 7b 0a  main.t9}..  2 {.
1580: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49        CREATE TRI
1590: 47 47 45 52 20 61 75 78 2e 74 72 32 20 42 45 46  GGER aux.tr2 BEF
15a0: 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20 74 39  ORE UPDATE ON t9
15b0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20 44   BEGIN.        D
15c0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 30 3b 0a  ELETE FROM t10;.
15d0: 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 20        END;.     
15e0: 20 55 50 44 41 54 45 20 74 39 20 53 45 54 20 61   UPDATE t9 SET a
15f0: 3d 31 3b 0a 20 20 7d 20 7b 61 75 78 2e 74 31 30  =1;.  } {aux.t10
1600: 7d 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  }.}.do_execsql_t
1610: 65 73 74 20 65 5f 64 65 6c 65 74 65 2d 32 2e 32  est e_delete-2.2
1620: 2e 58 20 7b 0a 20 20 44 52 4f 50 20 54 52 49 47  .X {.  DROP TRIG
1630: 47 45 52 20 6d 61 69 6e 2e 74 72 31 3b 0a 20 20  GER main.tr1;.  
1640: 44 52 4f 50 20 54 52 49 47 47 45 52 20 61 75 78  DROP TRIGGER aux
1650: 2e 74 72 32 3b 0a 7d 20 7b 7d 0a 0a 64 6f 5f 64  .tr2;.} {}..do_d
1660: 65 6c 65 74 65 5f 74 65 73 74 73 20 65 5f 64 65  elete_tests e_de
1670: 6c 65 74 65 2d 32 2e 32 2e 32 20 7b 0a 20 20 31  lete-2.2.2 {.  1
1680: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
1690: 54 52 49 47 47 45 52 20 61 75 78 2e 74 72 31 20  TRIGGER aux.tr1 
16a0: 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20  AFTER INSERT ON 
16b0: 74 38 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20  t8 BEGIN.       
16c0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 39 3b   DELETE FROM t9;
16d0: 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20  .      END;.    
16e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 75    INSERT INTO au
16f0: 78 2e 74 38 20 56 41 4c 55 45 53 28 31 2c 20 32  x.t8 VALUES(1, 2
1700: 29 3b 0a 0a 20 20 20 20 20 20 53 45 4c 45 43 54  );..      SELECT
1710: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61   count(*) FROM a
1720: 75 78 2e 74 39 20 0a 20 20 20 20 20 20 20 20 55  ux.t9 .        U
1730: 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 53  NION ALL.      S
1740: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1750: 52 4f 4d 20 61 75 78 32 2e 74 39 3b 0a 20 20 7d  ROM aux2.t9;.  }
1760: 20 7b 30 20 31 7d 0a 0a 20 20 32 20 7b 0a 20 20   {0 1}..  2 {.  
1770: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
1780: 45 52 20 6d 61 69 6e 2e 74 72 31 20 41 46 54 45  ER main.tr1 AFTE
1790: 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 38 20 42  R INSERT ON t8 B
17a0: 45 47 49 4e 0a 20 20 20 20 20 20 20 20 44 45 4c  EGIN.        DEL
17b0: 45 54 45 20 46 52 4f 4d 20 74 37 3b 0a 20 20 20  ETE FROM t7;.   
17c0: 20 20 20 45 4e 44 3b 0a 20 20 20 20 20 20 49 4e     END;.      IN
17d0: 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6e 2e 74  SERT INTO main.t
17e0: 38 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  8 VALUES(1, 2);.
17f0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .      SELECT co
1800: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 65 6d 70  unt(*) FROM temp
1810: 2e 74 37 20 0a 20 20 20 20 20 20 20 20 55 4e 49  .t7 .        UNI
1820: 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 53 45 4c  ON ALL.      SEL
1830: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1840: 4d 20 6d 61 69 6e 2e 74 37 0a 20 20 20 20 20 20  M main.t7.      
1850: 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20    UNION ALL.    
1860: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
1870: 29 20 46 52 4f 4d 20 61 75 78 2e 74 37 0a 20 20  ) FROM aux.t7.  
1880: 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
1890: 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75        SELECT cou
18a0: 6e 74 28 2a 29 20 46 52 4f 4d 20 61 75 78 32 2e  nt(*) FROM aux2.
18b0: 74 37 3b 0a 20 20 7d 20 7b 31 20 30 20 31 20 31  t7;.  } {1 0 1 1
18c0: 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  }.}..# EVIDENCE-
18d0: 4f 46 3a 20 52 2d 33 31 35 36 37 2d 33 38 35 38  OF: R-31567-3858
18e0: 37 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 74  7 If the table t
18f0: 6f 20 77 68 69 63 68 20 74 68 65 20 74 72 69 67  o which the trig
1900: 67 65 72 20 69 73 0a 23 20 61 74 74 61 63 68 65  ger is.# attache
1910: 64 20 69 73 20 69 6e 20 74 68 65 20 54 45 4d 50  d is in the TEMP
1920: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
1930: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
1940: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 23 20 74 61  name of the.# ta
1950: 62 6c 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ble being delete
1960: 64 20 69 73 20 72 65 73 6f 6c 76 65 64 20 69 6e  d is resolved in
1970: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1980: 20 69 74 20 69 73 20 66 6f 72 20 61 0a 23 20 74   it is for a.# t
1990: 6f 70 2d 6c 65 76 65 6c 20 73 74 61 74 65 6d 65  op-level stateme
19a0: 6e 74 20 28 62 79 20 73 65 61 72 63 68 69 6e 67  nt (by searching
19b0: 20 66 69 72 73 74 20 74 68 65 20 54 45 4d 50 20   first the TEMP 
19c0: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
19d0: 68 65 0a 23 20 6d 61 69 6e 20 64 61 74 61 62 61  he.# main databa
19e0: 73 65 2c 20 74 68 65 6e 20 61 6e 79 20 6f 74 68  se, then any oth
19f0: 65 72 20 64 61 74 61 62 61 73 65 73 20 69 6e 20  er databases in 
1a00: 74 68 65 20 6f 72 64 65 72 20 74 68 65 79 20 77  the order they w
1a10: 65 72 65 0a 23 20 61 74 74 61 63 68 65 64 29 2e  ere.# attached).
1a20: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1a30: 73 74 20 65 5f 64 65 6c 65 74 65 2d 32 2e 33 2e  st e_delete-2.3.
1a40: 30 20 7b 0a 20 20 44 52 4f 50 20 54 52 49 47 47  0 {.  DROP TRIGG
1a50: 45 52 20 61 75 78 2e 74 72 31 3b 0a 20 20 44 52  ER aux.tr1;.  DR
1a60: 4f 50 20 54 52 49 47 47 45 52 20 6d 61 69 6e 2e  OP TRIGGER main.
1a70: 74 72 31 3b 0a 20 20 44 45 4c 45 54 45 20 46 52  tr1;.  DELETE FR
1a80: 4f 4d 20 6d 61 69 6e 2e 74 38 20 57 48 45 52 45  OM main.t8 WHERE
1a90: 20 6f 69 64 3e 31 3b 0a 20 20 44 45 4c 45 54 45   oid>1;.  DELETE
1aa0: 20 46 52 4f 4d 20 61 75 78 2e 74 38 20 57 48 45   FROM aux.t8 WHE
1ab0: 52 45 20 6f 69 64 3e 31 3b 0a 20 20 49 4e 53 45  RE oid>1;.  INSE
1ac0: 52 54 20 49 4e 54 4f 20 61 75 78 2e 74 39 20 56  RT INTO aux.t9 V
1ad0: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 49  ALUES(1, 2);.  I
1ae0: 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6e 2e  NSERT INTO main.
1af0: 74 37 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t7 VALUES(3, 4);
1b00: 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  .} {}.do_execsql
1b10: 5f 74 65 73 74 20 65 5f 64 65 6c 65 74 65 2d 32  _test e_delete-2
1b20: 2e 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20  .3.1 {.  SELECT 
1b30: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 65  count(*) FROM te
1b40: 6d 70 2e 74 37 20 55 4e 49 4f 4e 20 41 4c 4c 20  mp.t7 UNION ALL 
1b50: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1b60: 46 52 4f 4d 20 6d 61 69 6e 2e 74 37 20 55 4e 49  FROM main.t7 UNI
1b70: 4f 4e 20 41 4c 4c 0a 20 20 53 45 4c 45 43 54 20  ON ALL.  SELECT 
1b80: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 75  count(*) FROM au
1b90: 78 2e 74 37 20 20 55 4e 49 4f 4e 20 41 4c 4c 20  x.t7  UNION ALL 
1ba0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1bb0: 46 52 4f 4d 20 61 75 78 32 2e 74 37 3b 0a 0a 20  FROM aux2.t7;.. 
1bc0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1bd0: 20 46 52 4f 4d 20 6d 61 69 6e 2e 74 38 20 55 4e   FROM main.t8 UN
1be0: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 63  ION ALL SELECT c
1bf0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 75 78  ount(*) FROM aux
1c00: 2e 74 38 20 20 0a 20 20 55 4e 49 4f 4e 20 41 4c  .t8  .  UNION AL
1c10: 4c 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  L SELECT count(*
1c20: 29 20 46 52 4f 4d 20 61 75 78 32 2e 74 38 3b 0a  ) FROM aux2.t8;.
1c30: 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  .  SELECT count(
1c40: 2a 29 20 46 52 4f 4d 20 61 75 78 2e 74 39 20 20  *) FROM aux.t9  
1c50: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
1c60: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61   count(*) FROM a
1c70: 75 78 32 2e 74 39 3b 0a 0a 20 20 53 45 4c 45 43  ux2.t9;..  SELEC
1c80: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1c90: 61 75 78 32 2e 74 31 30 3b 0a 7d 20 7b 31 20 31  aux2.t10;.} {1 1
1ca0: 20 31 20 31 20 31 20 31 20 31 20 31 20 31 20 31   1 1 1 1 1 1 1 1
1cb0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
1cc0: 74 20 65 5f 64 65 6c 65 74 65 2d 32 2e 33 2e 32  t e_delete-2.3.2
1cd0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 52 49 47   {.  CREATE TRIG
1ce0: 47 45 52 20 74 65 6d 70 2e 74 72 31 20 41 46 54  GER temp.tr1 AFT
1cf0: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 37 20  ER INSERT ON t7 
1d00: 42 45 47 49 4e 0a 20 20 20 20 44 45 4c 45 54 45  BEGIN.    DELETE
1d10: 20 46 52 4f 4d 20 74 37 3b 0a 20 20 20 20 44 45   FROM t7;.    DE
1d20: 4c 45 54 45 20 46 52 4f 4d 20 74 38 3b 0a 20 20  LETE FROM t8;.  
1d30: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 39    DELETE FROM t9
1d40: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
1d50: 4d 20 74 31 30 3b 0a 20 20 45 4e 44 3b 0a 20 20  M t10;.  END;.  
1d60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 6d 70  INSERT INTO temp
1d70: 2e 74 37 20 56 41 4c 55 45 53 28 27 68 65 6c 6c  .t7 VALUES('hell
1d80: 6f 27 2c 20 27 77 6f 72 6c 64 27 29 3b 0a 7d 20  o', 'world');.} 
1d90: 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  {}.do_execsql_te
1da0: 73 74 20 65 5f 64 65 6c 65 74 65 2d 32 2e 33 2e  st e_delete-2.3.
1db0: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f 75  3 {.  SELECT cou
1dc0: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 65 6d 70 2e  nt(*) FROM temp.
1dd0: 74 37 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  t7 UNION ALL SEL
1de0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1df0: 4d 20 6d 61 69 6e 2e 74 37 20 55 4e 49 4f 4e 20  M main.t7 UNION 
1e00: 41 4c 4c 0a 20 20 53 45 4c 45 43 54 20 63 6f 75  ALL.  SELECT cou
1e10: 6e 74 28 2a 29 20 46 52 4f 4d 20 61 75 78 2e 74  nt(*) FROM aux.t
1e20: 37 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  7  UNION ALL SEL
1e30: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1e40: 4d 20 61 75 78 32 2e 74 37 3b 0a 0a 20 20 53 45  M aux2.t7;..  SE
1e50: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1e60: 4f 4d 20 6d 61 69 6e 2e 74 38 20 55 4e 49 4f 4e  OM main.t8 UNION
1e70: 20 41 4c 4c 20 53 45 4c 45 43 54 20 63 6f 75 6e   ALL SELECT coun
1e80: 74 28 2a 29 20 46 52 4f 4d 20 61 75 78 2e 74 38  t(*) FROM aux.t8
1e90: 20 20 0a 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 53    .  UNION ALL S
1ea0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1eb0: 52 4f 4d 20 61 75 78 32 2e 74 38 3b 0a 0a 20 20  ROM aux2.t8;..  
1ec0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1ed0: 46 52 4f 4d 20 61 75 78 2e 74 39 20 20 55 4e 49  FROM aux.t9  UNI
1ee0: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 63 6f  ON ALL SELECT co
1ef0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 75 78 32  unt(*) FROM aux2
1f00: 2e 74 39 3b 0a 0a 20 20 53 45 4c 45 43 54 20 63  .t9;..  SELECT c
1f10: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 75 78  ount(*) FROM aux
1f20: 32 2e 74 31 30 3b 0a 7d 20 7b 30 20 31 20 31 20  2.t10;.} {0 1 1 
1f30: 31 20 30 20 31 20 31 20 30 20 31 20 30 7d 0a 0a  1 0 1 1 0 1 0}..
1f40: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
1f50: 2d 32 38 36 39 31 2d 34 39 34 36 34 20 54 68 65  -28691-49464 The
1f60: 20 49 4e 44 45 58 45 44 20 42 59 20 61 6e 64 20   INDEXED BY and 
1f70: 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
1f80: 73 65 73 20 61 72 65 0a 23 20 6e 6f 74 20 61 6c  ses are.# not al
1f90: 6c 6f 77 65 64 20 6f 6e 20 44 45 4c 45 54 45 20  lowed on DELETE 
1fa0: 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69  statements withi
1fb0: 6e 20 74 72 69 67 67 65 72 73 2e 0a 23 0a 64 6f  n triggers..#.do
1fc0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
1fd0: 64 65 6c 65 74 65 2d 32 2e 34 2e 30 20 7b 0a 20  delete-2.4.0 {. 
1fe0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 38   CREATE INDEX i8
1ff0: 20 4f 4e 20 74 38 28 61 2c 20 62 29 3b 0a 7d 20   ON t8(a, b);.} 
2000: 7b 7d 0a 64 6f 5f 64 65 6c 65 74 65 5f 74 65 73  {}.do_delete_tes
2010: 74 73 20 65 5f 64 65 6c 65 74 65 2d 32 2e 34 20  ts e_delete-2.4 
2020: 2d 65 72 72 6f 72 20 7b 0a 20 20 74 68 65 20 25  -error {.  the %
2030: 73 20 25 73 20 63 6c 61 75 73 65 20 69 73 20 6e  s %s clause is n
2040: 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 55 50  ot allowed on UP
2050: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
2060: 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e  tatements within
2070: 20 74 72 69 67 67 65 72 73 0a 7d 20 7b 0a 20 20   triggers.} {.  
2080: 31 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  1 {.    CREATE T
2090: 52 49 47 47 45 52 20 74 72 33 20 41 46 54 45 52  RIGGER tr3 AFTER
20a0: 20 49 4e 53 45 52 54 20 4f 4e 20 74 38 20 42 45   INSERT ON t8 BE
20b0: 47 49 4e 0a 20 20 20 20 20 20 44 45 4c 45 54 45  GIN.      DELETE
20c0: 20 46 52 4f 4d 20 74 38 20 49 4e 44 45 58 45 44   FROM t8 INDEXED
20d0: 20 42 59 20 69 38 20 57 48 45 52 45 20 61 3d 35   BY i8 WHERE a=5
20e0: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 20 7b  ;.    END;.  } {
20f0: 49 4e 44 45 58 45 44 20 42 59 7d 0a 20 20 32 20  INDEXED BY}.  2 
2100: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  {.    CREATE TRI
2110: 47 47 45 52 20 74 72 33 20 41 46 54 45 52 20 49  GGER tr3 AFTER I
2120: 4e 53 45 52 54 20 4f 4e 20 74 38 20 42 45 47 49  NSERT ON t8 BEGI
2130: 4e 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  N.      DELETE F
2140: 52 4f 4d 20 74 38 20 4e 4f 54 20 49 4e 44 45 58  ROM t8 NOT INDEX
2150: 45 44 20 57 48 45 52 45 20 61 3d 35 3b 0a 20 20  ED WHERE a=5;.  
2160: 20 20 45 4e 44 3b 0a 20 20 7d 20 7b 4e 4f 54 20    END;.  } {NOT 
2170: 49 4e 44 45 58 45 44 7d 0a 7d 0a 0a 69 66 63 61  INDEXED}.}..ifca
2180: 70 61 62 6c 65 20 75 70 64 61 74 65 5f 64 65 6c  pable update_del
2190: 65 74 65 5f 6c 69 6d 69 74 20 7b 0a 0a 23 20 45  ete_limit {..# E
21a0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 34  VIDENCE-OF: R-64
21b0: 39 34 32 2d 30 36 36 31 35 20 54 68 65 20 4c 49  942-06615 The LI
21c0: 4d 49 54 20 61 6e 64 20 4f 52 44 45 52 20 42 59  MIT and ORDER BY
21d0: 20 63 6c 61 75 73 65 73 20 28 64 65 73 63 72 69   clauses (descri
21e0: 62 65 64 0a 23 20 62 65 6c 6f 77 29 20 61 72 65  bed.# below) are
21f0: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 66 6f 72   unsupported for
2200: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
2210: 74 73 20 77 69 74 68 69 6e 20 74 72 69 67 67 65  ts within trigge
2220: 72 73 2e 0a 23 0a 64 6f 5f 64 65 6c 65 74 65 5f  rs..#.do_delete_
2230: 74 65 73 74 73 20 65 5f 64 65 6c 65 74 65 2d 32  tests e_delete-2
2240: 2e 35 20 2d 65 72 72 6f 72 20 7b 20 6e 65 61 72  .5 -error { near
2250: 20 22 25 73 22 3a 20 73 79 6e 74 61 78 20 65 72   "%s": syntax er
2260: 72 6f 72 20 7d 20 7b 0a 20 20 31 20 7b 0a 20 20  ror } {.  1 {.  
2270: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
2280: 20 74 72 33 20 41 46 54 45 52 20 49 4e 53 45 52   tr3 AFTER INSER
2290: 54 20 4f 4e 20 74 38 20 42 45 47 49 4e 0a 20 20  T ON t8 BEGIN.  
22a0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
22b0: 74 38 20 4c 49 4d 49 54 20 31 30 3b 0a 20 20 20  t8 LIMIT 10;.   
22c0: 20 45 4e 44 3b 0a 20 20 7d 20 7b 4c 49 4d 49 54   END;.  } {LIMIT
22d0: 7d 0a 20 20 32 20 7b 0a 20 20 20 20 43 52 45 41  }.  2 {.    CREA
22e0: 54 45 20 54 52 49 47 47 45 52 20 74 72 33 20 41  TE TRIGGER tr3 A
22f0: 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74  FTER INSERT ON t
2300: 38 20 42 45 47 49 4e 0a 20 20 20 20 20 20 44 45  8 BEGIN.      DE
2310: 4c 45 54 45 20 46 52 4f 4d 20 74 38 20 4f 52 44  LETE FROM t8 ORD
2320: 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 35 3b  ER BY a LIMIT 5;
2330: 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 20 7b 4f  .    END;.  } {O
2340: 52 44 45 52 7d 0a 7d 0a 0a 23 20 45 56 49 44 45  RDER}.}..# EVIDE
2350: 4e 43 45 2d 4f 46 3a 20 52 2d 34 30 30 32 36 2d  NCE-OF: R-40026-
2360: 31 30 35 33 31 20 49 66 20 53 51 4c 69 74 65 20  10531 If SQLite 
2370: 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  is compiled with
2380: 20 74 68 65 0a 23 20 53 51 4c 49 54 45 5f 45 4e   the.# SQLITE_EN
2390: 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45  ABLE_UPDATE_DELE
23a0: 54 45 5f 4c 49 4d 49 54 20 63 6f 6d 70 69 6c 65  TE_LIMIT compile
23b0: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 74 68  -time option, th
23c0: 65 6e 20 74 68 65 20 73 79 6e 74 61 78 0a 23 20  en the syntax.# 
23d0: 6f 66 20 74 68 65 20 44 45 4c 45 54 45 20 73 74  of the DELETE st
23e0: 61 74 65 6d 65 6e 74 20 69 73 20 65 78 74 65 6e  atement is exten
23f0: 64 65 64 20 62 79 20 74 68 65 20 61 64 64 69 74  ded by the addit
2400: 69 6f 6e 20 6f 66 20 6f 70 74 69 6f 6e 61 6c 20  ion of optional 
2410: 4f 52 44 45 52 0a 23 20 42 59 20 61 6e 64 20 4c  ORDER.# BY and L
2420: 49 4d 49 54 20 63 6c 61 75 73 65 73 3a 0a 23 0a  IMIT clauses:.#.
2430: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
2440: 2d 34 35 38 39 37 2d 30 31 36 37 30 20 2d 2d 20  -45897-01670 -- 
2450: 73 79 6e 74 61 78 20 64 69 61 67 72 61 6d 20 64  syntax diagram d
2460: 65 6c 65 74 65 2d 73 74 6d 74 2d 6c 69 6d 69 74  elete-stmt-limit
2470: 65 64 0a 23 0a 64 6f 5f 64 65 6c 65 74 65 5f 74  ed.#.do_delete_t
2480: 65 73 74 73 20 65 5f 64 65 6c 65 74 65 2d 33 2e  ests e_delete-3.
2490: 31 20 7b 0a 20 20 31 20 20 20 22 44 45 4c 45 54  1 {.  1   "DELET
24a0: 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20  E FROM t1 LIMIT 
24b0: 35 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5"              
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 20 20 20 20 7b 7d 0a 20 20 32 20 20 20 22        {}.  2   "
24e0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4c  DELETE FROM t1 L
24f0: 49 4d 49 54 20 35 2d 31 20 4f 46 46 53 45 54 20  IMIT 5-1 OFFSET 
2500: 32 2b 32 22 20 20 20 20 20 20 20 20 20 20 20 20  2+2"            
2510: 20 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20             {}.  
2520: 33 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  3   "DELETE FROM
2530: 20 74 31 20 4c 49 4d 49 54 20 32 2b 32 2c 20 31   t1 LIMIT 2+2, 1
2540: 36 2f 34 22 20 20 20 20 20 20 20 20 20 20 20 20  6/4"            
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 7b 7d 0a 20 20 34 20 20 20 22 44 45 4c 45 54 45  {}.  4   "DELETE
2570: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
2580: 59 20 78 20 4c 49 4d 49 54 20 35 22 20 20 20 20  Y x LIMIT 5"    
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 20 20 20 20 7b 7d 0a 20 20 35 20 20 20 22 44       {}.  5   "D
25b0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4f 52  ELETE FROM t1 OR
25c0: 44 45 52 20 42 59 20 78 20 4c 49 4d 49 54 20 35  DER BY x LIMIT 5
25d0: 2d 31 20 4f 46 46 53 45 54 20 32 2b 32 22 20 20  -1 OFFSET 2+2"  
25e0: 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20 36            {}.  6
25f0: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
2600: 74 31 20 4f 52 44 45 52 20 42 59 20 78 20 4c 49  t1 ORDER BY x LI
2610: 4d 49 54 20 32 2b 32 2c 20 31 36 2f 34 22 20 20  MIT 2+2, 16/4"  
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
2630: 7d 0a 20 20 37 20 20 20 22 44 45 4c 45 54 45 20  }.  7   "DELETE 
2640: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 3e  FROM t1 WHERE x>
2650: 32 20 4c 49 4d 49 54 20 35 22 20 20 20 20 20 20  2 LIMIT 5"      
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 20 20 7b 7d 0a 20 20 38 20 20 20 22 44 45      {}.  8   "DE
2680: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
2690: 52 45 20 78 3e 32 20 4c 49 4d 49 54 20 35 2d 31  RE x>2 LIMIT 5-1
26a0: 20 4f 46 46 53 45 54 20 32 2b 32 22 20 20 20 20   OFFSET 2+2"    
26b0: 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20 39 20           {}.  9 
26c0: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74    "DELETE FROM t
26d0: 31 20 57 48 45 52 45 20 78 3e 32 20 4c 49 4d 49  1 WHERE x>2 LIMI
26e0: 54 20 32 2b 32 2c 20 31 36 2f 34 22 20 20 20 20  T 2+2, 16/4"    
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 7d                {}
2700: 0a 20 20 31 30 20 20 22 44 45 4c 45 54 45 20 46  .  10  "DELETE F
2710: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 3e 32  ROM t1 WHERE x>2
2720: 20 4f 52 44 45 52 20 42 59 20 78 20 4c 49 4d 49   ORDER BY x LIMI
2730: 54 20 35 22 20 20 20 20 20 20 20 20 20 20 20 20  T 5"            
2740: 20 20 20 7b 7d 0a 20 20 31 31 20 20 22 44 45 4c     {}.  11  "DEL
2750: 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ETE FROM t1 WHER
2760: 45 20 78 3e 32 20 4f 52 44 45 52 20 42 59 20 78  E x>2 ORDER BY x
2770: 20 4c 49 4d 49 54 20 35 2d 31 20 4f 46 46 53 45   LIMIT 5-1 OFFSE
2780: 54 20 32 2b 32 22 20 20 7b 7d 0a 20 20 31 32 20  T 2+2"  {}.  12 
2790: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31   "DELETE FROM t1
27a0: 20 57 48 45 52 45 20 78 3e 32 20 4f 52 44 45 52   WHERE x>2 ORDER
27b0: 20 42 59 20 78 20 4c 49 4d 49 54 20 32 2b 32 2c   BY x LIMIT 2+2,
27c0: 20 31 36 2f 34 22 20 20 20 20 20 20 20 7b 7d 0a   16/4"       {}.
27d0: 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  }..drop_all_tabl
27e0: 65 73 0a 70 72 6f 63 20 72 65 62 75 69 6c 64 5f  es.proc rebuild_
27f0: 74 31 20 7b 7d 20 7b 0a 20 20 63 61 74 63 68 73  t1 {} {.  catchs
2800: 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20  ql { DROP TABLE 
2810: 74 31 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  t1 }.  execsql {
2820: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2830: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
2840: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
2850: 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b  ALUES(1, 'one');
2860: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2870: 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27 74   t1 VALUES(2, 't
2880: 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  wo');.    INSERT
2890: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
28a0: 33 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20 20  3, 'three');.   
28b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
28c0: 56 41 4c 55 45 53 28 34 2c 20 27 66 6f 75 72 27  VALUES(4, 'four'
28d0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
28e0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20  TO t1 VALUES(5, 
28f0: 27 66 69 76 65 27 29 3b 0a 20 20 7d 0a 7d 0a 0a  'five');.  }.}..
2900: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
2910: 2d 34 34 30 36 32 2d 30 38 35 35 30 20 49 66 20  -44062-08550 If 
2920: 61 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  a DELETE stateme
2930: 6e 74 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63  nt has a LIMIT c
2940: 6c 61 75 73 65 2c 0a 23 20 74 68 65 20 6d 61 78  lause,.# the max
2950: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72  imum number of r
2960: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
2970: 20 64 65 6c 65 74 65 64 20 69 73 20 66 6f 75 6e   deleted is foun
2980: 64 20 62 79 20 65 76 61 6c 75 61 74 69 6e 67 0a  d by evaluating.
2990: 23 20 74 68 65 20 61 63 63 6f 6d 70 61 6e 79 69  # the accompanyi
29a0: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ng expression an
29b0: 64 20 63 61 73 74 69 6e 67 20 69 74 20 74 6f 20  d casting it to 
29c0: 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
29d0: 2e 0a 23 0a 72 65 62 75 69 6c 64 5f 74 31 0a 64  ..#.rebuild_t1.d
29e0: 6f 5f 64 65 6c 65 74 65 5f 74 65 73 74 73 20 65  o_delete_tests e
29f0: 5f 64 65 6c 65 74 65 2d 33 2e 32 20 2d 72 65 70  _delete-3.2 -rep
2a00: 61 69 72 20 72 65 62 75 69 6c 64 5f 74 31 20 2d  air rebuild_t1 -
2a10: 71 75 65 72 79 20 7b 0a 20 20 53 45 4c 45 43 54  query {.  SELECT
2a20: 20 61 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 0a 20   a FROM t1.} {. 
2a30: 20 31 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f   1   "DELETE FRO
2a40: 4d 20 74 31 20 4c 49 4d 49 54 20 33 22 20 20 20  M t1 LIMIT 3"   
2a50: 20 20 20 20 7b 34 20 35 7d 0a 20 20 32 20 20 20      {4 5}.  2   
2a60: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20  "DELETE FROM t1 
2a70: 4c 49 4d 49 54 20 31 2b 31 22 20 20 20 20 20 7b  LIMIT 1+1"     {
2a80: 33 20 34 20 35 7d 0a 20 20 33 20 20 20 22 44 45  3 4 5}.  3   "DE
2a90: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d  LETE FROM t1 LIM
2aa0: 49 54 20 27 34 27 22 20 20 20 20 20 7b 35 7d 0a  IT '4'"     {5}.
2ab0: 20 20 34 20 20 20 22 44 45 4c 45 54 45 20 46 52    4   "DELETE FR
2ac0: 4f 4d 20 74 31 20 4c 49 4d 49 54 20 27 31 2e 30  OM t1 LIMIT '1.0
2ad0: 27 22 20 20 20 7b 32 20 33 20 34 20 35 7d 0a 7d  '"   {2 3 4 5}.}
2ae0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
2af0: 20 52 2d 30 32 36 36 31 2d 35 36 33 39 39 20 49   R-02661-56399 I
2b00: 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  f the result of 
2b10: 74 68 65 20 65 76 61 6c 75 61 74 69 6e 67 20 74  the evaluating t
2b20: 68 65 20 4c 49 4d 49 54 0a 23 20 63 6c 61 75 73  he LIMIT.# claus
2b30: 65 20 63 61 6e 6e 6f 74 20 62 65 20 6c 6f 73 73  e cannot be loss
2b40: 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72 74 65 64  lessly converted
2b50: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 76   to an integer v
2b60: 61 6c 75 65 2c 20 69 74 20 69 73 20 61 6e 0a 23  alue, it is an.#
2b70: 20 65 72 72 6f 72 2e 0a 23 0a 64 6f 5f 64 65 6c   error..#.do_del
2b80: 65 74 65 5f 74 65 73 74 73 20 65 5f 64 65 6c 65  ete_tests e_dele
2b90: 74 65 2d 33 2e 33 20 2d 65 72 72 6f 72 20 7b 20  te-3.3 -error { 
2ba0: 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63  datatype mismatc
2bb0: 68 20 7d 20 7b 0a 20 20 31 20 20 20 22 44 45 4c  h } {.  1   "DEL
2bc0: 45 54 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49  ETE FROM t1 LIMI
2bd0: 54 20 27 61 62 63 27 22 20 20 20 7b 7d 0a 20 20  T 'abc'"   {}.  
2be0: 32 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  2   "DELETE FROM
2bf0: 20 74 31 20 4c 49 4d 49 54 20 4e 55 4c 4c 22 20   t1 LIMIT NULL" 
2c00: 20 20 20 7b 7d 0a 20 20 33 20 20 20 22 44 45 4c     {}.  3   "DEL
2c10: 45 54 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49  ETE FROM t1 LIMI
2c20: 54 20 58 27 41 42 43 44 27 22 20 7b 7d 0a 20 20  T X'ABCD'" {}.  
2c30: 34 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  4   "DELETE FROM
2c40: 20 74 31 20 4c 49 4d 49 54 20 31 2e 32 22 20 20   t1 LIMIT 1.2"  
2c50: 20 20 20 7b 7d 0a 7d 0a 0a 23 20 45 56 49 44 45     {}.}..# EVIDE
2c60: 4e 43 45 2d 4f 46 3a 20 52 2d 30 30 35 39 38 2d  NCE-OF: R-00598-
2c70: 30 33 37 34 31 20 41 20 6e 65 67 61 74 69 76 65  03741 A negative
2c80: 20 4c 49 4d 49 54 20 76 61 6c 75 65 20 69 73 20   LIMIT value is 
2c90: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 23  interpreted as.#
2ca0: 20 22 6e 6f 20 6c 69 6d 69 74 22 2e 0a 23 0a 64   "no limit"..#.d
2cb0: 6f 5f 64 65 6c 65 74 65 5f 74 65 73 74 73 20 65  o_delete_tests e
2cc0: 5f 64 65 6c 65 74 65 2d 33 2e 34 20 2d 72 65 70  _delete-3.4 -rep
2cd0: 61 69 72 20 72 65 62 75 69 6c 64 5f 74 31 20 2d  air rebuild_t1 -
2ce0: 71 75 65 72 79 20 7b 0a 20 20 53 45 4c 45 43 54  query {.  SELECT
2cf0: 20 61 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 0a 20   a FROM t1.} {. 
2d00: 20 31 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f   1   "DELETE FRO
2d10: 4d 20 74 31 20 4c 49 4d 49 54 20 2d 31 22 20 20  M t1 LIMIT -1"  
2d20: 20 20 20 20 20 7b 7d 0a 20 20 32 20 20 20 22 44       {}.  2   "D
2d30: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4c 49  ELETE FROM t1 LI
2d40: 4d 49 54 20 32 2d 34 22 20 20 20 20 20 20 7b 7d  MIT 2-4"      {}
2d50: 0a 20 20 33 20 20 20 22 44 45 4c 45 54 45 20 46  .  3   "DELETE F
2d60: 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 2d 34 2e  ROM t1 LIMIT -4.
2d70: 30 22 20 20 20 20 20 7b 7d 0a 20 20 34 20 20 20  0"     {}.  4   
2d80: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20  "DELETE FROM t1 
2d90: 4c 49 4d 49 54 20 35 2a 2d 31 22 20 20 20 20 20  LIMIT 5*-1"     
2da0: 7b 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  {}.}..# EVIDENCE
2db0: 2d 4f 46 3a 20 52 2d 32 36 33 37 37 2d 34 39 31  -OF: R-26377-491
2dc0: 39 35 20 49 66 20 74 68 65 20 44 45 4c 45 54 45  95 If the DELETE
2dd0: 20 73 74 61 74 65 6d 65 6e 74 20 61 6c 73 6f 20   statement also 
2de0: 68 61 73 20 61 6e 20 4f 46 46 53 45 54 0a 23 20  has an OFFSET.# 
2df0: 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 69 74 20  clause, then it 
2e00: 69 73 20 73 69 6d 69 6c 61 72 6c 79 20 65 76 61  is similarly eva
2e10: 6c 75 61 74 65 64 20 61 6e 64 20 63 61 73 74 20  luated and cast 
2e20: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  to an integer va
2e30: 6c 75 65 2e 0a 23 20 41 67 61 69 6e 2c 20 69 74  lue..# Again, it
2e40: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20   is an error if 
2e50: 74 68 65 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  the value cannot
2e60: 20 62 65 20 6c 6f 73 73 6c 65 73 73 6c 79 20 63   be losslessly c
2e70: 6f 6e 76 65 72 74 65 64 20 74 6f 0a 23 20 61 6e  onverted to.# an
2e80: 20 69 6e 74 65 67 65 72 2e 0a 23 0a 64 6f 5f 64   integer..#.do_d
2e90: 65 6c 65 74 65 5f 74 65 73 74 73 20 65 5f 64 65  elete_tests e_de
2ea0: 6c 65 74 65 2d 33 2e 35 20 2d 65 72 72 6f 72 20  lete-3.5 -error 
2eb0: 7b 20 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61  { datatype misma
2ec0: 74 63 68 20 7d 20 7b 0a 20 20 31 20 20 20 22 44  tch } {.  1   "D
2ed0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4c 49  ELETE FROM t1 LI
2ee0: 4d 49 54 20 31 20 4f 46 46 53 45 54 20 27 61 62  MIT 1 OFFSET 'ab
2ef0: 63 27 22 20 20 20 7b 7d 0a 20 20 32 20 20 20 22  c'"   {}.  2   "
2f00: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4c  DELETE FROM t1 L
2f10: 49 4d 49 54 20 31 20 4f 46 46 53 45 54 20 4e 55  IMIT 1 OFFSET NU
2f20: 4c 4c 22 20 20 20 20 7b 7d 0a 20 20 33 20 20 20  LL"    {}.  3   
2f30: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20  "DELETE FROM t1 
2f40: 4c 49 4d 49 54 20 31 20 4f 46 46 53 45 54 20 58  LIMIT 1 OFFSET X
2f50: 27 41 42 43 44 27 22 20 7b 7d 0a 20 20 34 20 20  'ABCD'" {}.  4  
2f60: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31   "DELETE FROM t1
2f70: 20 4c 49 4d 49 54 20 31 20 4f 46 46 53 45 54 20   LIMIT 1 OFFSET 
2f80: 31 2e 32 22 20 20 20 20 20 7b 7d 0a 20 20 35 20  1.2"     {}.  5 
2f90: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74    "DELETE FROM t
2fa0: 31 20 4c 49 4d 49 54 20 27 61 62 63 27 2c 20 31  1 LIMIT 'abc', 1
2fb0: 22 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20 36  "         {}.  6
2fc0: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
2fd0: 74 31 20 4c 49 4d 49 54 20 4e 55 4c 4c 2c 20 31  t1 LIMIT NULL, 1
2fe0: 22 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20  "          {}.  
2ff0: 37 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  7   "DELETE FROM
3000: 20 74 31 20 4c 49 4d 49 54 20 58 27 41 42 43 44   t1 LIMIT X'ABCD
3010: 27 2c 20 31 22 20 20 20 20 20 20 20 7b 7d 0a 20  ', 1"       {}. 
3020: 20 38 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f   8   "DELETE FRO
3030: 4d 20 74 31 20 4c 49 4d 49 54 20 31 2e 32 2c 20  M t1 LIMIT 1.2, 
3040: 31 22 20 20 20 20 20 20 20 20 20 20 20 7b 7d 0a  1"           {}.
3050: 7d 0a 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  }...# EVIDENCE-O
3060: 46 3a 20 52 2d 36 34 30 30 34 2d 35 33 38 31 34  F: R-64004-53814
3070: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
3080: 4f 46 46 53 45 54 20 63 6c 61 75 73 65 2c 20 6f  OFFSET clause, o
3090: 72 20 74 68 65 0a 23 20 63 61 6c 63 75 6c 61 74  r the.# calculat
30a0: 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  ed integer value
30b0: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
30c0: 65 20 65 66 66 65 63 74 69 76 65 20 4f 46 46 53  e effective OFFS
30d0: 45 54 20 76 61 6c 75 65 20 69 73 0a 23 20 7a 65  ET value is.# ze
30e0: 72 6f 2e 0a 23 0a 64 6f 5f 64 65 6c 65 74 65 5f  ro..#.do_delete_
30f0: 74 65 73 74 73 20 65 5f 64 65 6c 65 74 65 2d 33  tests e_delete-3
3100: 2e 36 20 2d 72 65 70 61 69 72 20 72 65 62 75 69  .6 -repair rebui
3110: 6c 64 5f 74 31 20 2d 71 75 65 72 79 20 7b 0a 20  ld_t1 -query {. 
3120: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
3130: 31 0a 7d 20 7b 0a 20 20 31 61 20 20 22 44 45 4c  1.} {.  1a  "DEL
3140: 45 54 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49  ETE FROM t1 LIMI
3150: 54 20 33 20 4f 46 46 53 45 54 20 30 22 20 20 20  T 3 OFFSET 0"   
3160: 20 20 20 20 20 7b 34 20 35 7d 0a 20 20 31 62 20       {4 5}.  1b 
3170: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31   "DELETE FROM t1
3180: 20 4c 49 4d 49 54 20 33 22 20 20 20 20 20 20 20   LIMIT 3"       
3190: 20 20 20 20 20 20 20 20 20 20 7b 34 20 35 7d 0a            {4 5}.
31a0: 20 20 31 63 20 20 22 44 45 4c 45 54 45 20 46 52    1c  "DELETE FR
31b0: 4f 4d 20 74 31 20 4c 49 4d 49 54 20 33 20 4f 46  OM t1 LIMIT 3 OF
31c0: 46 53 45 54 20 2d 31 22 20 20 20 20 20 20 20 7b  FSET -1"       {
31d0: 34 20 35 7d 0a 20 20 32 61 20 20 22 44 45 4c 45  4 5}.  2a  "DELE
31e0: 54 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54  TE FROM t1 LIMIT
31f0: 20 31 2b 31 20 4f 46 46 53 45 54 20 30 22 20 20   1+1 OFFSET 0"  
3200: 20 20 20 20 7b 33 20 34 20 35 7d 0a 20 20 32 62      {3 4 5}.  2b
3210: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74    "DELETE FROM t
3220: 31 20 4c 49 4d 49 54 20 31 2b 31 22 20 20 20 20  1 LIMIT 1+1"    
3230: 20 20 20 20 20 20 20 20 20 20 20 7b 33 20 34 20             {3 4 
3240: 35 7d 0a 20 20 32 63 20 20 22 44 45 4c 45 54 45  5}.  2c  "DELETE
3250: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 31   FROM t1 LIMIT 1
3260: 2b 31 20 4f 46 46 53 45 54 20 32 2d 35 22 20 20  +1 OFFSET 2-5"  
3270: 20 20 7b 33 20 34 20 35 7d 0a 20 20 33 61 20 20    {3 4 5}.  3a  
3280: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20  "DELETE FROM t1 
3290: 4c 49 4d 49 54 20 27 34 27 20 4f 46 46 53 45 54  LIMIT '4' OFFSET
32a0: 20 30 22 20 20 20 20 20 20 7b 35 7d 0a 20 20 33   0"      {5}.  3
32b0: 62 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  b  "DELETE FROM 
32c0: 74 31 20 4c 49 4d 49 54 20 27 34 27 22 20 20 20  t1 LIMIT '4'"   
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 35 7d 0a              {5}.
32e0: 20 20 33 63 20 20 22 44 45 4c 45 54 45 20 46 52    3c  "DELETE FR
32f0: 4f 4d 20 74 31 20 4c 49 4d 49 54 20 27 34 27 20  OM t1 LIMIT '4' 
3300: 4f 46 46 53 45 54 20 2d 31 2e 30 22 20 20 20 7b  OFFSET -1.0"   {
3310: 35 7d 0a 20 20 34 61 20 20 22 44 45 4c 45 54 45  5}.  4a  "DELETE
3320: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 27   FROM t1 LIMIT '
3330: 31 2e 30 27 20 4f 46 46 53 45 54 20 30 22 20 20  1.0' OFFSET 0"  
3340: 20 20 7b 32 20 33 20 34 20 35 7d 0a 20 20 34 62    {2 3 4 5}.  4b
3350: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74    "DELETE FROM t
3360: 31 20 4c 49 4d 49 54 20 27 31 2e 30 27 22 20 20  1 LIMIT '1.0'"  
3370: 20 20 20 20 20 20 20 20 20 20 20 7b 32 20 33 20             {2 3 
3380: 34 20 35 7d 0a 20 20 34 63 20 20 22 44 45 4c 45  4 5}.  4c  "DELE
3390: 54 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54  TE FROM t1 LIMIT
33a0: 20 27 31 2e 30 27 20 4f 46 46 53 45 54 20 2d 31   '1.0' OFFSET -1
33b0: 31 22 20 20 7b 32 20 33 20 34 20 35 7d 0a 7d 0a  1"  {2 3 4 5}.}.
33c0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
33d0: 52 2d 34 38 31 34 31 2d 35 32 33 33 34 20 49 66  R-48141-52334 If
33e0: 20 74 68 65 20 44 45 4c 45 54 45 20 73 74 61 74   the DELETE stat
33f0: 65 6d 65 6e 74 20 68 61 73 20 61 6e 20 4f 52 44  ement has an ORD
3400: 45 52 20 42 59 0a 23 20 63 6c 61 75 73 65 2c 20  ER BY.# clause, 
3410: 74 68 65 6e 20 61 6c 6c 20 72 6f 77 73 20 74 68  then all rows th
3420: 61 74 20 77 6f 75 6c 64 20 62 65 20 64 65 6c 65  at would be dele
3430: 74 65 64 20 69 6e 20 74 68 65 20 61 62 73 65 6e  ted in the absen
3440: 63 65 20 6f 66 20 74 68 65 0a 23 20 4c 49 4d 49  ce of the.# LIMI
3450: 54 20 63 6c 61 75 73 65 20 61 72 65 20 73 6f 72  T clause are sor
3460: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ted according to
3470: 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 20 54   the ORDER BY. T
3480: 68 65 20 66 69 72 73 74 20 4d 20 72 6f 77 73 2c  he first M rows,
3490: 0a 23 20 77 68 65 72 65 20 4d 20 69 73 20 74 68  .# where M is th
34a0: 65 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79  e value found by
34b0: 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20   evaluating the 
34c0: 4f 46 46 53 45 54 20 63 6c 61 75 73 65 20 65 78  OFFSET clause ex
34d0: 70 72 65 73 73 69 6f 6e 2c 0a 23 20 61 72 65 20  pression,.# are 
34e0: 73 6b 69 70 70 65 64 2c 20 61 6e 64 20 74 68 65  skipped, and the
34f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 4e 2c 20 77 68   following N, wh
3500: 65 72 65 20 4e 20 69 73 20 74 68 65 20 76 61 6c  ere N is the val
3510: 75 65 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 0a  ue of the LIMIT.
3520: 23 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 61 72  # expression, ar
3530: 65 20 64 65 6c 65 74 65 64 2e 0a 23 0a 64 6f 5f  e deleted..#.do_
3540: 64 65 6c 65 74 65 5f 74 65 73 74 73 20 65 5f 64  delete_tests e_d
3550: 65 6c 65 74 65 2d 33 2e 37 20 2d 72 65 70 61 69  elete-3.7 -repai
3560: 72 20 72 65 62 75 69 6c 64 5f 74 31 20 2d 71 75  r rebuild_t1 -qu
3570: 65 72 79 20 7b 0a 20 20 53 45 4c 45 43 54 20 61  ery {.  SELECT a
3580: 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 0a 20 20 31   FROM t1.} {.  1
3590: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
35a0: 74 31 20 4f 52 44 45 52 20 42 59 20 62 20 4c 49  t1 ORDER BY b LI
35b0: 4d 49 54 20 32 22 20 20 20 20 20 20 20 20 20 20  MIT 2"          
35c0: 20 20 20 20 20 7b 31 20 32 20 33 7d 0a 20 20 32       {1 2 3}.  2
35d0: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
35e0: 74 31 20 4f 52 44 45 52 20 42 59 20 6c 65 6e 67  t1 ORDER BY leng
35f0: 74 68 28 62 29 2c 20 61 20 4c 49 4d 49 54 20 33  th(b), a LIMIT 3
3600: 22 20 20 20 20 7b 33 20 35 7d 0a 20 20 33 20 20  "    {3 5}.  3  
3610: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31   "DELETE FROM t1
3620: 20 4f 52 44 45 52 20 42 59 20 61 20 44 45 53 43   ORDER BY a DESC
3630: 20 4c 49 4d 49 54 20 31 20 4f 46 46 53 45 54 20   LIMIT 1 OFFSET 
3640: 30 22 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20  0"  {1 2 3 4}.  
3650: 34 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  4   "DELETE FROM
3660: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 20 44   t1 ORDER BY a D
3670: 45 53 43 20 4c 49 4d 49 54 20 31 20 4f 46 46 53  ESC LIMIT 1 OFFS
3680: 45 54 20 31 22 20 20 7b 31 20 32 20 33 20 35 7d  ET 1"  {1 2 3 5}
3690: 0a 20 20 35 20 20 20 22 44 45 4c 45 54 45 20 46  .  5   "DELETE F
36a0: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
36b0: 61 20 44 45 53 43 20 4c 49 4d 49 54 20 31 20 4f  a DESC LIMIT 1 O
36c0: 46 46 53 45 54 20 32 22 20 20 7b 31 20 32 20 34  FFSET 2"  {1 2 4
36d0: 20 35 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43   5}.}..# EVIDENC
36e0: 45 2d 4f 46 3a 20 52 2d 36 34 35 33 35 2d 30 38  E-OF: R-64535-08
36f0: 34 31 34 20 49 66 20 74 68 65 72 65 20 61 72 65  414 If there are
3700: 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 72 6f 77   less than N row
3710: 73 20 72 65 6d 61 69 6e 69 6e 67 0a 23 20 61 66  s remaining.# af
3720: 74 65 72 20 74 61 6b 69 6e 67 20 74 68 65 20 4f  ter taking the O
3730: 46 46 53 45 54 20 63 6c 61 75 73 65 20 69 6e 74  FFSET clause int
3740: 6f 20 61 63 63 6f 75 6e 74 2c 20 6f 72 20 69 66  o account, or if
3750: 20 74 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   the LIMIT claus
3760: 65 0a 23 20 65 76 61 6c 75 61 74 65 64 20 74 6f  e.# evaluated to
3770: 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   a negative valu
3780: 65 2c 20 74 68 65 6e 20 61 6c 6c 20 72 65 6d 61  e, then all rema
3790: 69 6e 69 6e 67 20 72 6f 77 73 20 61 72 65 20 64  ining rows are d
37a0: 65 6c 65 74 65 64 2e 0a 23 0a 64 6f 5f 64 65 6c  eleted..#.do_del
37b0: 65 74 65 5f 74 65 73 74 73 20 65 5f 64 65 6c 65  ete_tests e_dele
37c0: 74 65 2d 33 2e 38 20 2d 72 65 70 61 69 72 20 72  te-3.8 -repair r
37d0: 65 62 75 69 6c 64 5f 74 31 20 2d 71 75 65 72 79  ebuild_t1 -query
37e0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 20 46 52   {.  SELECT a FR
37f0: 4f 4d 20 74 31 0a 7d 20 7b 0a 20 20 31 20 20 20  OM t1.} {.  1   
3800: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20  "DELETE FROM t1 
3810: 4f 52 44 45 52 20 42 59 20 61 20 41 53 43 20 4c  ORDER BY a ASC L
3820: 49 4d 49 54 20 31 30 22 20 20 20 20 20 20 20 20  IMIT 10"        
3830: 20 20 20 7b 7d 0a 20 20 32 20 20 20 22 44 45 4c     {}.  2   "DEL
3840: 45 54 45 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  ETE FROM t1 ORDE
3850: 52 20 42 59 20 61 20 41 53 43 20 4c 49 4d 49 54  R BY a ASC LIMIT
3860: 20 2d 31 22 20 20 20 20 20 20 20 20 20 20 20 7b   -1"           {
3870: 7d 0a 20 20 33 20 20 20 22 44 45 4c 45 54 45 20  }.  3   "DELETE 
3880: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
3890: 20 61 20 41 53 43 20 4c 49 4d 49 54 20 34 20 4f   a ASC LIMIT 4 O
38a0: 46 46 53 45 54 20 32 22 20 20 20 7b 31 20 32 7d  FFSET 2"   {1 2}
38b0: 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .}..# EVIDENCE-O
38c0: 46 3a 20 52 2d 33 37 32 38 34 2d 30 36 39 36 35  F: R-37284-06965
38d0: 20 49 66 20 74 68 65 20 44 45 4c 45 54 45 20 73   If the DELETE s
38e0: 74 61 74 65 6d 65 6e 74 20 68 61 73 20 6e 6f 20  tatement has no 
38f0: 4f 52 44 45 52 20 42 59 0a 23 20 63 6c 61 75 73  ORDER BY.# claus
3900: 65 2c 20 74 68 65 6e 20 61 6c 6c 20 72 6f 77 73  e, then all rows
3910: 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 64   that would be d
3920: 65 6c 65 74 65 64 20 69 6e 20 74 68 65 20 61 62  eleted in the ab
3930: 73 65 6e 63 65 20 6f 66 20 74 68 65 0a 23 20 4c  sence of the.# L
3940: 49 4d 49 54 20 63 6c 61 75 73 65 20 61 72 65 20  IMIT clause are 
3950: 61 73 73 65 6d 62 6c 65 64 20 69 6e 20 61 6e 20  assembled in an 
3960: 61 72 62 69 74 72 61 72 79 20 6f 72 64 65 72 20  arbitrary order 
3970: 62 65 66 6f 72 65 20 61 70 70 6c 79 69 6e 67 20  before applying 
3980: 74 68 65 0a 23 20 4c 49 4d 49 54 20 61 6e 64 20  the.# LIMIT and 
3990: 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 74  OFFSET clauses t
39a0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
39b0: 73 75 62 73 65 74 20 74 68 61 74 20 61 72 65 20  subset that are 
39c0: 61 63 74 75 61 6c 6c 79 0a 23 20 64 65 6c 65 74  actually.# delet
39d0: 65 64 2e 0a 23 0a 23 20 20 20 20 20 49 6e 20 70  ed..#.#     In p
39e0: 72 61 63 74 69 63 65 2c 20 74 68 65 20 22 61 72  ractice, the "ar
39f0: 62 69 74 72 61 72 79 20 6f 72 64 65 72 22 20 69  bitrary order" i
3a00: 73 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 23  s rowid order..#
3a10: 0a 64 6f 5f 64 65 6c 65 74 65 5f 74 65 73 74 73  .do_delete_tests
3a20: 20 65 5f 64 65 6c 65 74 65 2d 33 2e 39 20 2d 72   e_delete-3.9 -r
3a30: 65 70 61 69 72 20 72 65 62 75 69 6c 64 5f 74 31  epair rebuild_t1
3a40: 20 2d 71 75 65 72 79 20 7b 0a 20 20 53 45 4c 45   -query {.  SELE
3a50: 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 7d 20 7b  CT a FROM t1.} {
3a60: 0a 20 20 31 20 20 20 22 44 45 4c 45 54 45 20 46  .  1   "DELETE F
3a70: 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 32 22 20  ROM t1 LIMIT 2" 
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 33                {3
3a90: 20 34 20 35 7d 0a 20 20 32 20 20 20 22 44 45 4c   4 5}.  2   "DEL
3aa0: 45 54 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49  ETE FROM t1 LIMI
3ab0: 54 20 33 22 20 20 20 20 20 20 20 20 20 20 20 20  T 3"            
3ac0: 20 20 20 7b 34 20 35 7d 0a 20 20 33 20 20 20 22     {4 5}.  3   "
3ad0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4c  DELETE FROM t1 L
3ae0: 49 4d 49 54 20 31 20 4f 46 46 53 45 54 20 30 22  IMIT 1 OFFSET 0"
3af0: 20 20 20 20 20 20 7b 32 20 33 20 34 20 35 7d 0a        {2 3 4 5}.
3b00: 20 20 34 20 20 20 22 44 45 4c 45 54 45 20 46 52    4   "DELETE FR
3b10: 4f 4d 20 74 31 20 4c 49 4d 49 54 20 31 20 4f 46  OM t1 LIMIT 1 OF
3b20: 46 53 45 54 20 31 22 20 20 20 20 20 20 7b 31 20  FSET 1"      {1 
3b30: 33 20 34 20 35 7d 0a 20 20 35 20 20 20 22 44 45  3 4 5}.  5   "DE
3b40: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 4c 49 4d  LETE FROM t1 LIM
3b50: 49 54 20 31 20 4f 46 46 53 45 54 20 32 22 20 20  IT 1 OFFSET 2"  
3b60: 20 20 20 20 7b 31 20 32 20 34 20 35 7d 0a 7d 0a      {1 2 4 5}.}.
3b70: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
3b80: 20 52 2d 30 37 35 34 38 2d 31 33 34 32 32 20 54   R-07548-13422 T
3b90: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
3ba0: 73 65 20 6f 6e 20 61 20 44 45 4c 45 54 45 20 73  se on a DELETE s
3bb0: 74 61 74 65 6d 65 6e 74 0a 23 20 69 73 20 75 73  tatement.# is us
3bc0: 65 64 20 6f 6e 6c 79 20 74 6f 20 64 65 74 65 72  ed only to deter
3bd0: 6d 69 6e 65 20 77 68 69 63 68 20 72 6f 77 73 20  mine which rows 
3be0: 66 61 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20  fall within the 
3bf0: 4c 49 4d 49 54 2e 20 54 68 65 20 6f 72 64 65 72  LIMIT. The order
3c00: 0a 23 20 69 6e 20 77 68 69 63 68 20 72 6f 77 73  .# in which rows
3c10: 20 61 72 65 20 64 65 6c 65 74 65 64 20 69 73 20   are deleted is 
3c20: 61 72 62 69 74 72 61 72 79 20 61 6e 64 20 69 73  arbitrary and is
3c30: 20 6e 6f 74 20 69 6e 66 6c 75 65 6e 63 65 64 20   not influenced 
3c40: 62 79 20 74 68 65 0a 23 20 4f 52 44 45 52 20 42  by the.# ORDER B
3c50: 59 20 63 6c 61 75 73 65 2e 0a 23 0a 23 20 20 20  Y clause..#.#   
3c60: 20 20 49 6e 20 70 72 61 63 74 69 63 65 2c 20 72    In practice, r
3c70: 6f 77 73 20 61 72 65 20 61 6c 77 61 79 73 20 64  ows are always d
3c80: 65 6c 65 74 65 64 20 69 6e 20 72 6f 77 69 64 20  eleted in rowid 
3c90: 6f 72 64 65 72 2e 0a 23 0a 64 6f 5f 64 65 6c 65  order..#.do_dele
3ca0: 74 65 5f 74 65 73 74 73 20 65 5f 64 65 6c 65 74  te_tests e_delet
3cb0: 65 2d 33 2e 31 30 20 2d 72 65 70 61 69 72 20 7b  e-3.10 -repair {
3cc0: 0a 20 20 72 65 62 75 69 6c 64 5f 74 31 20 0a 20  .  rebuild_t1 . 
3cd0: 20 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50   catchsql { DROP
3ce0: 20 54 41 42 4c 45 20 74 31 6c 6f 67 20 7d 0a 20   TABLE t1log }. 
3cf0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
3d00: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 6c 6f  REATE TABLE t1lo
3d10: 67 28 78 29 3b 0a 20 20 20 20 43 52 45 41 54 45  g(x);.    CREATE
3d20: 20 54 52 49 47 47 45 52 20 74 72 31 20 41 46 54   TRIGGER tr1 AFT
3d30: 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 74 31 20  ER DELETE ON t1 
3d40: 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45  BEGIN.      INSE
3d50: 52 54 20 49 4e 54 4f 20 74 31 6c 6f 67 20 56 41  RT INTO t1log VA
3d60: 4c 55 45 53 28 6f 6c 64 2e 61 29 3b 0a 20 20 20  LUES(old.a);.   
3d70: 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 2d 71 75 65   END;.  }.} -que
3d80: 72 79 20 7b 0a 20 20 53 45 4c 45 43 54 20 78 20  ry {.  SELECT x 
3d90: 46 52 4f 4d 20 74 31 6c 6f 67 0a 7d 20 7b 0a 20  FROM t1log.} {. 
3da0: 20 31 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f   1   "DELETE FRO
3db0: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 20  M t1 ORDER BY a 
3dc0: 44 45 53 43 20 4c 49 4d 49 54 20 32 22 20 20 20  DESC LIMIT 2"   
3dd0: 7b 34 20 35 7d 0a 20 20 32 20 20 20 22 44 45 4c  {4 5}.  2   "DEL
3de0: 45 54 45 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  ETE FROM t1 ORDE
3df0: 52 20 42 59 20 61 20 44 45 53 43 20 4c 49 4d 49  R BY a DESC LIMI
3e00: 54 20 2d 31 22 20 20 7b 31 20 32 20 33 20 34 20  T -1"  {1 2 3 4 
3e10: 35 7d 0a 20 20 33 20 20 20 22 44 45 4c 45 54 45  5}.  3   "DELETE
3e20: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
3e30: 59 20 61 20 41 53 43 20 4c 49 4d 49 54 20 32 22  Y a ASC LIMIT 2"
3e40: 20 20 20 20 7b 31 20 32 7d 0a 20 20 34 20 20 20      {1 2}.  4   
3e50: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20  "DELETE FROM t1 
3e60: 4f 52 44 45 52 20 42 59 20 61 20 41 53 43 20 4c  ORDER BY a ASC L
3e70: 49 4d 49 54 20 2d 31 22 20 20 20 7b 31 20 32 20  IMIT -1"   {1 2 
3e80: 33 20 34 20 35 7d 0a 7d 0a 0a 7d 0a 20 0a 66 69  3 4 5}.}..}. .fi
3e90: 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.