/ Hex Artifact Content
Login

Artifact 5926c71f9c12d2ab73ef35c29376e756eb68361c:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 74 63 6c 0a 23  #!/usr/bin/tcl.#
0010: 0a 23 20 54 68 69 73 20 73 63 72 69 70 74 20 6d  .# This script m
0020: 61 6b 65 73 20 6d 6f 64 69 66 69 63 61 74 69 6f  akes modificatio
0030: 6e 73 20 74 6f 20 74 68 65 20 76 64 62 65 2e 63  ns to the vdbe.c
0040: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 77 68 69   source file whi
0050: 63 68 20 72 65 64 75 63 65 0a 23 20 74 68 65 20  ch reduce.# the 
0060: 61 6d 6f 75 6e 74 20 6f 66 20 73 74 61 63 6b 20  amount of stack 
0070: 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 62  space required b
0080: 79 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  y the sqlite3Vdb
0090: 65 45 78 65 63 28 29 20 72 6f 75 74 69 6e 65 2e  eExec() routine.
00a0: 0a 23 0a 23 20 54 68 65 20 6d 6f 64 69 66 69 63  .#.# The modific
00b0: 61 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64  ations performed
00c0: 20 62 79 20 74 68 69 73 20 73 63 72 69 70 74 20   by this script 
00d0: 61 72 65 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 54  are optional.  T
00e0: 68 65 20 76 64 62 65 2e 63 0a 23 20 73 6f 75 72  he vdbe.c.# sour
00f0: 63 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6d  ce file will com
0100: 70 69 6c 65 20 63 6f 72 72 65 63 74 6c 79 20 77  pile correctly w
0110: 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20  ith and without 
0120: 74 68 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  the modification
0130: 73 0a 23 20 70 65 72 66 6f 72 6d 65 64 20 62 79  s.# performed by
0140: 20 74 68 69 73 20 73 63 72 69 70 74 2e 20 20 41   this script.  A
0150: 6e 64 20 61 6c 6c 20 72 6f 75 74 69 6e 65 73 20  nd all routines 
0160: 77 69 74 68 69 6e 20 76 64 62 65 2e 63 20 77 69  within vdbe.c wi
0170: 6c 6c 20 63 6f 6d 70 75 74 65 0a 23 20 74 68 65  ll compute.# the
0180: 20 73 61 6d 65 20 72 65 73 75 6c 74 2e 20 20 54   same result.  T
0190: 68 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  he modifications
01a0: 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 73 63   made by this sc
01b0: 72 69 70 74 20 6d 65 72 65 6c 79 20 68 65 6c 70  ript merely help
01c0: 0a 23 20 74 68 65 20 43 20 63 6f 6d 70 69 6c 65  .# the C compile
01d0: 72 20 74 6f 20 67 65 6e 65 72 61 74 65 20 63 6f  r to generate co
01e0: 64 65 20 66 6f 72 20 73 71 6c 69 74 65 33 56 64  de for sqlite3Vd
01f0: 62 65 45 78 65 63 28 29 20 74 68 61 74 20 75 73  beExec() that us
0200: 65 73 20 6c 65 73 73 0a 23 20 73 74 61 63 6b 20  es less.# stack 
0210: 73 70 61 63 65 2e 0a 23 0a 23 20 53 63 72 69 70  space..#.# Scrip
0220: 74 20 75 73 61 67 65 3a 0a 23 0a 23 20 20 20 20  t usage:.#.#    
0230: 20 20 20 20 20 20 6d 76 20 76 64 62 65 2e 63 20        mv vdbe.c 
0240: 76 64 62 65 2e 63 2e 74 65 6d 70 6c 61 74 65 0a  vdbe.c.template.
0250: 23 20 20 20 20 20 20 20 20 20 20 74 63 6c 73 68  #          tclsh
0260: 20 76 64 62 65 2d 63 6f 6d 70 72 65 73 73 2e 74   vdbe-compress.t
0270: 63 6c 20 24 43 46 4c 41 47 53 20 3c 76 64 62 65  cl $CFLAGS <vdbe
0280: 2e 63 2e 74 65 6d 70 6c 61 74 65 20 3e 76 64 62  .c.template >vdb
0290: 65 2e 63 0a 23 0a 23 20 4d 6f 64 69 66 69 63 61  e.c.#.# Modifica
02a0: 74 69 6f 6e 73 20 6d 61 64 65 3a 0a 23 0a 23 20  tions made:.#.# 
02b0: 41 6c 6c 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  All modification
02c0: 73 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65  s are within the
02d0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
02e0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  () function.  Th
02f0: 65 0a 23 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  e.# modification
0300: 73 20 73 65 65 6b 20 74 6f 20 72 65 64 75 63 65  s seek to reduce
0310: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
0320: 74 61 63 6b 20 73 70 61 63 65 20 61 6c 6c 6f 63  tack space alloc
0330: 61 74 65 64 20 62 79 0a 23 20 74 68 69 73 20 72  ated by.# this r
0340: 6f 75 74 69 6e 65 20 62 79 20 6d 6f 76 69 6e 67  outine by moving
0350: 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20   local variable 
0360: 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 6f 75 74  declarations out
0370: 20 6f 66 20 69 6e 64 69 76 69 64 75 61 6c 0a 23   of individual.#
0380: 20 6f 70 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e   opcode implemen
0390: 74 61 74 69 6f 6e 73 20 61 6e 64 20 69 6e 74 6f  tations and into
03a0: 20 61 20 73 69 6e 67 6c 65 20 6c 61 72 67 65 20   a single large 
03b0: 75 6e 69 6f 6e 2e 20 20 54 68 65 20 75 6e 69 6f  union.  The unio
03c0: 6e 20 63 6f 6e 74 61 69 6e 73 0a 23 20 61 20 73  n contains.# a s
03d0: 65 70 61 72 61 74 65 20 73 74 72 75 63 74 75 72  eparate structur
03e0: 65 20 66 6f 72 20 65 61 63 68 20 6f 70 63 6f 64  e for each opcod
03f0: 65 20 61 6e 64 20 74 68 61 74 20 73 74 72 75 63  e and that struc
0400: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  ture contains th
0410: 65 0a 23 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  e.# local variab
0420: 6c 65 73 20 75 73 65 64 20 62 79 20 74 68 61 74  les used by that
0430: 20 6f 70 63 6f 64 65 2e 20 20 49 6e 20 74 68 69   opcode.  In thi
0440: 73 20 77 61 79 2c 20 74 68 65 20 74 6f 74 61 6c  s way, the total
0450: 20 61 6d 6f 75 6e 74 0a 23 20 6f 66 20 73 74 61   amount.# of sta
0460: 63 6b 20 73 70 61 63 65 20 72 65 71 75 69 72 65  ck space require
0470: 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
0480: 45 78 65 63 28 29 20 69 73 20 72 65 64 75 63 65  Exec() is reduce
0490: 64 20 66 72 6f 6d 20 74 68 65 0a 23 20 73 75 6d  d from the.# sum
04a0: 20 6f 66 20 61 6c 6c 20 6c 6f 63 61 6c 20 76 61   of all local va
04b0: 72 69 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6d  riables to the m
04c0: 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 6c 6f  aximum of the lo
04d0: 63 61 6c 20 76 61 72 69 61 62 6c 65 20 73 70 61  cal variable spa
04e0: 63 65 0a 23 20 72 65 71 75 69 72 65 64 20 66 6f  ce.# required fo
04f0: 72 20 61 6e 79 20 73 69 6e 67 6c 65 20 6f 70 63  r any single opc
0500: 6f 64 65 2e 0a 23 0a 23 20 49 6e 20 6f 72 64 65  ode..#.# In orde
0510: 72 20 74 6f 20 62 65 20 72 65 63 6f 67 6e 69 7a  r to be recogniz
0520: 65 64 20 62 79 20 74 68 69 73 20 73 63 72 69 70  ed by this scrip
0530: 74 2c 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  t, local variabl
0540: 65 73 20 6d 75 73 74 20 61 70 70 65 61 72 0a 23  es must appear.#
0550: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 6c 69   on the first li
0560: 6e 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65  ne after the ope
0570: 6e 20 63 75 72 6c 79 2d 62 72 61 63 65 20 74 68  n curly-brace th
0580: 61 74 20 62 65 67 69 6e 73 20 61 20 6e 65 77 20  at begins a new 
0590: 6f 70 63 6f 64 65 0a 23 20 69 6d 70 6c 65 6d 65  opcode.# impleme
05a0: 6e 74 61 74 69 6f 6e 2e 20 20 4c 6f 63 61 6c 20  ntation.  Local 
05b0: 76 61 72 69 61 62 6c 65 73 20 6d 75 73 74 20 6e  variables must n
05c0: 6f 74 20 68 61 76 65 20 69 6e 69 74 69 61 6c 69  ot have initiali
05d0: 7a 65 72 73 2c 20 74 68 6f 75 67 68 20 74 68 65  zers, though the
05e0: 79 0a 23 20 6d 61 79 20 62 65 20 63 6f 6d 6d 65  y.# may be comme
05f0: 6e 74 65 64 2e 0a 23 0a 23 20 54 68 65 20 75 6e  nted..#.# The un
0600: 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 69  ion definition i
0610: 73 20 69 6e 73 65 72 74 65 64 20 69 6e 20 70 6c  s inserted in pl
0620: 61 63 65 20 6f 66 20 61 20 73 70 65 63 69 61 6c  ace of a special
0630: 20 6d 61 72 6b 65 72 20 63 6f 6d 6d 65 6e 74 0a   marker comment.
0640: 23 20 69 6e 20 74 68 65 20 70 72 65 61 6d 62 6c  # in the preambl
0650: 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  e to the sqlite3
0660: 56 64 62 65 45 78 65 63 28 29 20 69 6d 70 6c 65  VdbeExec() imple
0670: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 23 0a 23 23 23  mentation..#.###
0680: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0690: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
06a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
06b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
06c0: 23 23 23 23 23 23 23 23 23 23 0a 23 0a 73 65 74  ##########.#.set
06d0: 20 62 65 66 6f 72 65 55 6e 69 6f 6e 20 7b 7d 20   beforeUnion {} 
06e0: 20 20 3b 23 20 43 20 63 6f 64 65 20 62 65 66 6f    ;# C code befo
06f0: 72 65 20 75 6e 69 6f 6e 0a 73 65 74 20 75 6e 69  re union.set uni
0700: 6f 6e 44 65 66 20 7b 7d 20 20 20 20 20 20 3b 23  onDef {}      ;#
0710: 20 43 20 63 6f 64 65 20 6f 66 20 74 68 65 20 75   C code of the u
0720: 6e 69 6f 6e 0a 73 65 74 20 61 66 74 65 72 55 6e  nion.set afterUn
0730: 69 6f 6e 20 7b 7d 20 20 20 20 3b 23 20 43 20 63  ion {}    ;# C c
0740: 6f 64 65 20 61 66 74 65 72 20 74 68 65 20 75 6e  ode after the un
0750: 69 6f 6e 0a 73 65 74 20 73 43 74 72 20 30 20 20  ion.set sCtr 0  
0760: 20 20 20 20 20 20 20 20 20 3b 23 20 43 6f 6e 74           ;# Cont
0770: 65 78 74 20 63 6f 75 6e 74 65 72 0a 0a 23 20 49  ext counter..# I
0780: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 4d 41  f the SQLITE_SMA
0790: 4c 4c 5f 53 54 41 43 4b 20 63 6f 6d 70 69 6c 65  LL_STACK compile
07a0: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
07b0: 6d 69 73 73 69 6e 67 2c 20 74 68 65 6e 0a 23 20  missing, then.# 
07c0: 74 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  this transformat
07d0: 69 6f 6e 20 62 65 63 6f 6d 65 73 20 61 20 6e 6f  ion becomes a no
07e0: 2d 6f 70 2e 0a 23 0a 69 66 20 7b 21 5b 72 65 67  -op..#.if {![reg
07f0: 65 78 70 20 7b 53 51 4c 49 54 45 5f 53 4d 41 4c  exp {SQLITE_SMAL
0800: 4c 5f 53 54 41 43 4b 7d 20 24 61 72 67 76 5d 7d  L_STACK} $argv]}
0810: 20 7b 0a 20 20 77 68 69 6c 65 20 7b 21 5b 65 6f   {.  while {![eo
0820: 66 20 73 74 64 69 6e 5d 7d 20 7b 0a 20 20 20 20  f stdin]} {.    
0830: 70 75 74 73 20 5b 67 65 74 73 20 73 74 64 69 6e  puts [gets stdin
0840: 5d 0a 20 20 7d 0a 20 20 65 78 69 74 0a 7d 0a 0a  ].  }.  exit.}..
0850: 23 20 52 65 61 64 20 70 72 6f 67 72 61 6d 20 74  # Read program t
0860: 65 78 74 20 75 70 20 74 6f 20 74 68 65 20 73 70  ext up to the sp
0870: 6f 74 20 77 68 65 72 65 20 74 68 65 20 75 6e 69  ot where the uni
0880: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 0a 23 20 69  on should be.# i
0890: 6e 73 65 72 74 65 64 2e 0a 23 0a 77 68 69 6c 65  nserted..#.while
08a0: 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20   {![eof stdin]} 
08b0: 7b 0a 20 20 73 65 74 20 6c 69 6e 65 20 5b 67 65  {.  set line [ge
08c0: 74 73 20 73 74 64 69 6e 5d 0a 20 20 69 66 20 7b  ts stdin].  if {
08d0: 5b 72 65 67 65 78 70 20 7b 49 4e 53 45 52 54 20  [regexp {INSERT 
08e0: 53 54 41 43 4b 20 55 4e 49 4f 4e 20 48 45 52 45  STACK UNION HERE
08f0: 7d 20 24 6c 69 6e 65 5d 7d 20 62 72 65 61 6b 0a  } $line]} break.
0900: 20 20 61 70 70 65 6e 64 20 62 65 66 6f 72 65 55    append beforeU
0910: 6e 69 6f 6e 20 24 6c 69 6e 65 5c 6e 0a 7d 0a 0a  nion $line\n.}..
0920: 23 20 50 72 6f 63 65 73 73 20 74 68 65 20 72 65  # Process the re
0930: 6d 61 69 6e 69 6e 67 20 74 65 78 74 2e 20 20 42  maining text.  B
0940: 75 69 6c 64 20 75 70 20 74 68 65 20 75 6e 69 6f  uild up the unio
0950: 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 61 73 20  n definition as 
0960: 77 65 20 67 6f 2e 0a 23 0a 73 65 74 20 76 6c 69  we go..#.set vli
0970: 73 74 20 7b 7d 0a 73 65 74 20 73 65 65 6e 44 65  st {}.set seenDe
0980: 63 6c 20 30 0a 73 65 74 20 6e 61 6d 65 63 68 61  cl 0.set namecha
0990: 72 73 20 7b 61 62 63 64 65 66 67 68 69 6a 6b 6c  rs {abcdefghijkl
09a0: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7d 0a  mnopqrstuvwxyz}.
09b0: 73 65 74 20 6e 6e 63 20 5b 73 74 72 69 6e 67 20  set nnc [string 
09c0: 6c 65 6e 67 74 68 20 24 6e 61 6d 65 63 68 61 72  length $namechar
09d0: 73 5d 0a 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20  s].while {![eof 
09e0: 73 74 64 69 6e 5d 7d 20 7b 0a 20 20 73 65 74 20  stdin]} {.  set 
09f0: 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e  line [gets stdin
0a00: 5d 0a 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20  ].  if {[regexp 
0a10: 22 5e 63 61 73 65 20 28 4f 50 5f 5c 5c 77 2b 29  "^case (OP_\\w+)
0a20: 3a 20 5c 31 37 33 22 20 24 6c 69 6e 65 20 61 6c  : \173" $line al
0a30: 6c 20 6f 70 65 72 61 74 6f 72 5d 7d 20 7b 0a 20  l operator]} {. 
0a40: 20 20 20 61 70 70 65 6e 64 20 61 66 74 65 72 55     append afterU
0a50: 6e 69 6f 6e 20 24 6c 69 6e 65 5c 6e 0a 20 20 20  nion $line\n.   
0a60: 20 73 65 74 20 76 6c 69 73 74 20 7b 7d 0a 20 20   set vlist {}.  
0a70: 20 20 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73    while {![eof s
0a80: 74 64 69 6e 5d 7d 20 7b 0a 20 20 20 20 20 20 73  tdin]} {.      s
0a90: 65 74 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74  et line [gets st
0aa0: 64 69 6e 5d 0a 20 20 20 20 20 20 69 66 20 7b 5b  din].      if {[
0ab0: 72 65 67 65 78 70 20 7b 5e 20 2b 28 63 6f 6e 73  regexp {^ +(cons
0ac0: 74 20 29 3f 5c 77 2b 20 5c 2a 2a 28 5c 77 2b 29  t )?\w+ \**(\w+)
0ad0: 28 5c 5b 2e 2a 5c 5d 29 3f 3b 7d 20 24 6c 69 6e  (\[.*\])?;} $lin
0ae0: 65 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 61  e \.           a
0af0: 6c 6c 20 63 6f 6e 73 74 4b 65 79 77 6f 72 64 20  ll constKeyword 
0b00: 76 6e 61 6d 65 20 6e 6f 74 75 73 65 64 31 5d 7d  vname notused1]}
0b10: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21   {.        if {!
0b20: 24 73 65 65 6e 44 65 63 6c 7d 20 7b 0a 20 20 20  $seenDecl} {.   
0b30: 20 20 20 20 20 20 20 73 65 74 20 73 6e 61 6d 65         set sname
0b40: 20 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 61 70   {}.          ap
0b50: 70 65 6e 64 20 73 6e 61 6d 65 20 5b 73 74 72 69  pend sname [stri
0b60: 6e 67 20 69 6e 64 65 78 20 24 6e 61 6d 65 63 68  ng index $namech
0b70: 61 72 73 20 5b 65 78 70 72 20 7b 24 73 43 74 72  ars [expr {$sCtr
0b80: 2f 24 6e 6e 63 7d 5d 5d 0a 20 20 20 20 20 20 20  /$nnc}]].       
0b90: 20 20 20 61 70 70 65 6e 64 20 73 6e 61 6d 65 20     append sname 
0ba0: 5b 73 74 72 69 6e 67 20 69 6e 64 65 78 20 24 6e  [string index $n
0bb0: 61 6d 65 63 68 61 72 73 20 5b 65 78 70 72 20 7b  amechars [expr {
0bc0: 24 73 43 74 72 25 24 6e 6e 63 7d 5d 5d 0a 20 20  $sCtr%$nnc}]].  
0bd0: 20 20 20 20 20 20 20 20 69 6e 63 72 20 73 43 74          incr sCt
0be0: 72 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65  r.          appe
0bf0: 6e 64 20 75 6e 69 6f 6e 44 65 66 20 22 20 20 20  nd unionDef "   
0c00: 20 73 74 72 75 63 74 20 24 7b 6f 70 65 72 61 74   struct ${operat
0c10: 6f 72 7d 5f 73 74 61 63 6b 5f 76 61 72 73 20 5c  or}_stack_vars \
0c20: 31 37 33 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  173\n".         
0c30: 20 61 70 70 65 6e 64 20 61 66 74 65 72 55 6e 69   append afterUni
0c40: 6f 6e 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  on \.           
0c50: 20 20 22 23 69 66 20 30 20 20 2f 2a 20 6c 6f 63    "#if 0  /* loc
0c60: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 6d 6f 76  al variables mov
0c70: 65 64 20 69 6e 74 6f 20 75 2e 24 73 6e 61 6d 65  ed into u.$sname
0c80: 20 2a 2f 5c 6e 22 0a 20 20 20 20 20 20 20 20 20   */\n".         
0c90: 20 73 65 74 20 73 65 65 6e 44 65 63 6c 20 31 0a   set seenDecl 1.
0ca0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0cb0: 20 20 61 70 70 65 6e 64 20 75 6e 69 6f 6e 44 65    append unionDe
0cc0: 66 20 22 20 20 20 20 24 6c 69 6e 65 5c 6e 22 0a  f "    $line\n".
0cd0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 61          append a
0ce0: 66 74 65 72 55 6e 69 6f 6e 20 24 6c 69 6e 65 5c  fterUnion $line\
0cf0: 6e 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  n.        lappen
0d00: 64 20 76 6c 69 73 74 20 24 76 6e 61 6d 65 0a 20  d vlist $vname. 
0d10: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
0d20: 72 65 67 65 78 70 20 7b 5e 23 28 69 66 7c 65 6e  regexp {^#(if|en
0d30: 64 69 66 29 7d 20 24 6c 69 6e 65 5d 20 26 26 20  dif)} $line] && 
0d40: 5b 6c 6c 65 6e 67 74 68 20 24 76 6c 69 73 74 5d  [llength $vlist]
0d50: 3e 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 61 70  >0} {.        ap
0d60: 70 65 6e 64 20 75 6e 69 6f 6e 44 65 66 20 22 24  pend unionDef "$
0d70: 6c 69 6e 65 5c 6e 22 0a 20 20 20 20 20 20 20 20  line\n".        
0d80: 61 70 70 65 6e 64 20 61 66 74 65 72 55 6e 69 6f  append afterUnio
0d90: 6e 20 24 6c 69 6e 65 5c 6e 0a 20 20 20 20 20 20  n $line\n.      
0da0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
0db0: 20 62 72 65 61 6b 0a 20 20 20 20 20 20 7d 0a 20   break.      }. 
0dc0: 20 20 20 7d 0a 20 20 20 20 69 66 20 7b 24 73 65     }.    if {$se
0dd0: 65 6e 44 65 63 6c 7d 20 7b 0a 20 20 20 20 20 20  enDecl} {.      
0de0: 61 70 70 65 6e 64 20 75 6e 69 6f 6e 44 65 66 20  append unionDef 
0df0: 20 20 22 20 20 20 20 5c 31 37 35 20 24 73 6e 61    "    \175 $sna
0e00: 6d 65 3b 5c 6e 22 0a 20 20 20 20 20 20 61 70 70  me;\n".      app
0e10: 65 6e 64 20 61 66 74 65 72 55 6e 69 6f 6e 20 22  end afterUnion "
0e20: 23 65 6e 64 69 66 20 2f 2a 20 6c 6f 63 61 6c 20  #endif /* local 
0e30: 76 61 72 69 61 62 6c 65 73 20 6d 6f 76 65 64 20  variables moved 
0e40: 69 6e 74 6f 20 75 2e 24 73 6e 61 6d 65 20 2a 2f  into u.$sname */
0e50: 5c 6e 22 0a 20 20 20 20 7d 0a 20 20 20 20 73 65  \n".    }.    se
0e60: 74 20 73 65 65 6e 44 65 63 6c 20 30 0a 20 20 7d  t seenDecl 0.  }
0e70: 0a 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 22  .  if {[regexp "
0e80: 5e 5c 31 37 35 22 20 24 6c 69 6e 65 5d 7d 20 7b  ^\175" $line]} {
0e90: 0a 20 20 20 20 61 70 70 65 6e 64 20 61 66 74 65  .    append afte
0ea0: 72 55 6e 69 6f 6e 20 24 6c 69 6e 65 5c 6e 0a 20  rUnion $line\n. 
0eb0: 20 20 20 73 65 74 20 76 6c 69 73 74 20 7b 7d 0a     set vlist {}.
0ec0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c 6c 65    } elseif {[lle
0ed0: 6e 67 74 68 20 24 76 6c 69 73 74 5d 3e 30 7d 20  ngth $vlist]>0} 
0ee0: 7b 0a 20 20 20 20 61 70 70 65 6e 64 20 6c 69 6e  {.    append lin
0ef0: 65 20 22 20 22 0a 20 20 20 20 66 6f 72 65 61 63  e " ".    foreac
0f00: 68 20 76 20 24 76 6c 69 73 74 20 7b 0a 20 20 20  h v $vlist {.   
0f10: 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 22     regsub -all "
0f20: 28 5c 5b 5e 61 2d 7a 41 2d 5a 30 2d 39 3e 2e 5c  (\[^a-zA-Z0-9>.\
0f30: 5d 29 24 7b 76 7d 28 5c 5c 57 29 22 20 24 6c 69  ])${v}(\\W)" $li
0f40: 6e 65 20 22 5c 5c 31 75 2e 24 73 6e 61 6d 65 2e  ne "\\1u.$sname.
0f50: 24 76 5c 5c 32 22 20 6c 69 6e 65 0a 20 20 20 20  $v\\2" line.    
0f60: 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 22 28    regsub -all "(
0f70: 5c 5b 5e 61 2d 7a 41 2d 5a 30 2d 39 3e 2e 5c 5d  \[^a-zA-Z0-9>.\]
0f80: 29 24 7b 76 7d 28 5c 5c 57 29 22 20 24 6c 69 6e  )${v}(\\W)" $lin
0f90: 65 20 22 5c 5c 31 75 2e 24 73 6e 61 6d 65 2e 24  e "\\1u.$sname.$
0fa0: 76 5c 5c 32 22 20 6c 69 6e 65 0a 0a 20 20 20 20  v\\2" line..    
0fb0: 20 20 23 20 54 68 65 20 65 78 70 72 65 73 73 69    # The expressi
0fc0: 6f 6e 73 20 61 62 6f 76 65 20 66 61 69 6c 20 74  ons above fail t
0fd0: 6f 20 63 61 74 63 68 20 69 6e 73 74 61 6e 63 65  o catch instance
0fe0: 20 6f 66 20 76 61 72 69 61 62 6c 65 20 22 61 62   of variable "ab
0ff0: 63 22 20 69 6e 0a 20 20 20 20 20 20 23 20 65 78  c" in.      # ex
1000: 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65 20 28  pressions like (
1010: 33 32 3e 61 62 63 29 2e 20 54 68 65 20 66 6f 6c  32>abc). The fol
1020: 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
1030: 6e 20 6d 61 6b 65 73 20 74 68 6f 73 65 0a 20 20  n makes those.  
1040: 20 20 20 20 23 20 73 75 62 73 74 69 74 75 74 69      # substituti
1050: 6f 6e 73 2e 0a 20 20 20 20 20 20 72 65 67 73 75  ons..      regsu
1060: 62 20 2d 61 6c 6c 20 22 28 5c 5b 5e 2d 5c 5d 29  b -all "(\[^-\])
1070: 3e 24 7b 76 7d 28 5c 5c 57 29 22 20 24 6c 69 6e  >${v}(\\W)" $lin
1080: 65 20 22 5c 5c 31 3e 75 2e 24 73 6e 61 6d 65 2e  e "\\1>u.$sname.
1090: 24 76 5c 5c 32 22 20 6c 69 6e 65 0a 20 20 20 20  $v\\2" line.    
10a0: 7d 0a 20 20 20 20 61 70 70 65 6e 64 20 61 66 74  }.    append aft
10b0: 65 72 55 6e 69 6f 6e 20 5b 73 74 72 69 6e 67 20  erUnion [string 
10c0: 74 72 69 6d 72 69 67 68 74 20 24 6c 69 6e 65 5d  trimright $line]
10d0: 5c 6e 0a 20 20 7d 20 65 6c 73 65 69 66 20 7b 24  \n.  } elseif {$
10e0: 6c 69 6e 65 3d 3d 22 22 20 26 26 20 5b 65 6f 66  line=="" && [eof
10f0: 20 73 74 64 69 6e 5d 7d 20 7b 0a 20 20 20 20 23   stdin]} {.    #
1100: 20 6e 6f 2d 6f 70 0a 20 20 7d 20 65 6c 73 65 20   no-op.  } else 
1110: 7b 0a 20 20 20 20 61 70 70 65 6e 64 20 61 66 74  {.    append aft
1120: 65 72 55 6e 69 6f 6e 20 24 6c 69 6e 65 5c 6e 0a  erUnion $line\n.
1130: 20 20 7d 0a 7d 0a 0a 23 20 4f 75 74 70 75 74 20    }.}..# Output 
1140: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 74 65  the resulting te
1150: 78 74 2e 0a 23 0a 70 75 74 73 20 2d 6e 6f 6e 65  xt..#.puts -none
1160: 77 6c 69 6e 65 20 24 62 65 66 6f 72 65 55 6e 69  wline $beforeUni
1170: 6f 6e 0a 70 75 74 73 20 22 20 20 2f 2a 2a 2a 2a  on.puts "  /****
1180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c0: 22 0a 70 75 74 73 20 22 20 20 2a 2a 20 41 75 74  ".puts "  ** Aut
11d0: 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72  omatically gener
11e0: 61 74 65 64 20 63 6f 64 65 22 0a 70 75 74 73 20  ated code".puts 
11f0: 22 20 20 2a 2a 22 0a 70 75 74 73 20 22 20 20 2a  "  **".puts "  *
1200: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1210: 75 6e 69 6f 6e 20 69 73 20 61 75 74 6f 6d 61 74  union is automat
1220: 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64  ically generated
1230: 20 62 79 20 74 68 65 22 0a 70 75 74 73 20 22 20   by the".puts " 
1240: 20 2a 2a 20 76 64 62 65 2d 63 6f 6d 70 72 65 73   ** vdbe-compres
1250: 73 2e 74 63 6c 20 73 63 72 69 70 74 2e 20 20 54  s.tcl script.  T
1260: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  he purpose of th
1270: 69 73 20 75 6e 69 6f 6e 20 69 73 20 74 6f 22 0a  is union is to".
1280: 70 75 74 73 20 22 20 20 2a 2a 20 72 65 64 75 63  puts "  ** reduc
1290: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
12a0: 73 74 61 63 6b 20 73 70 61 63 65 20 72 65 71 75  stack space requ
12b0: 69 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ired by this fun
12c0: 63 74 69 6f 6e 2e 22 0a 70 75 74 73 20 22 20 20  ction.".puts "  
12d0: 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  ** See comments 
12e0: 69 6e 20 74 68 65 20 76 64 62 65 2d 63 6f 6d 70  in the vdbe-comp
12f0: 72 65 73 73 2e 74 63 6c 20 73 63 72 69 70 74 20  ress.tcl script 
1300: 66 6f 72 20 64 65 74 61 69 6c 73 2e 22 0a 70 75  for details.".pu
1310: 74 73 20 22 20 20 2a 2f 22 0a 70 75 74 73 20 22  ts "  */".puts "
1320: 20 20 75 6e 69 6f 6e 20 76 64 62 65 45 78 65 63    union vdbeExec
1330: 55 6e 69 6f 6e 20 5c 31 37 33 22 0a 70 75 74 73  Union \173".puts
1340: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 75 6e 69   -nonewline $uni
1350: 6f 6e 44 65 66 0a 70 75 74 73 20 22 20 20 5c 31  onDef.puts "  \1
1360: 37 35 20 75 3b 22 0a 70 75 74 73 20 22 20 20 2f  75 u;".puts "  /
1370: 2a 20 45 6e 64 20 61 75 74 6f 6d 61 74 69 63 61  * End automatica
1380: 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20 63 6f  lly generated co
1390: 64 65 22 0a 70 75 74 73 20 22 20 20 2a 2a 2a 2a  de".puts "  ****
13a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e0: 2f 22 0a 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69  /".puts -nonewli
13f0: 6e 65 20 24 61 66 74 65 72 55 6e 69 6f 6e 0a     ne $afterUnion.