/ Hex Artifact Content
Login

Artifact d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f:


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 3c 76 64 62 65 2e 63 2e 74 65 6d 70 6c  cl <vdbe.c.templ
0280: 61 74 65 20 3e 76 64 62 65 2e 63 0a 23 0a 23 20  ate >vdbe.c.#.# 
0290: 4d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 6d 61  Modifications ma
02a0: 64 65 3a 0a 23 0a 23 20 41 6c 6c 20 6d 6f 64 69  de:.#.# All modi
02b0: 66 69 63 61 74 69 6f 6e 73 20 61 72 65 20 77 69  fications are wi
02c0: 74 68 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  thin the sqlite3
02d0: 56 64 62 65 45 78 65 63 28 29 20 66 75 6e 63 74  VdbeExec() funct
02e0: 69 6f 6e 2e 20 20 54 68 65 0a 23 20 6d 6f 64 69  ion.  The.# modi
02f0: 66 69 63 61 74 69 6f 6e 73 20 73 65 65 6b 20 74  fications seek t
0300: 6f 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f  o reduce the amo
0310: 75 6e 74 20 6f 66 20 73 74 61 63 6b 20 73 70 61  unt of stack spa
0320: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  ce allocated by.
0330: 23 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  # this routine b
0340: 79 20 6d 6f 76 69 6e 67 20 6c 6f 63 61 6c 20 76  y moving local v
0350: 61 72 69 61 62 6c 65 20 64 65 63 6c 61 72 61 74  ariable declarat
0360: 69 6f 6e 73 20 6f 75 74 20 6f 66 20 69 6e 64 69  ions out of indi
0370: 76 69 64 75 61 6c 0a 23 20 6f 70 63 6f 64 65 20  vidual.# opcode 
0380: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
0390: 61 6e 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  and into a singl
03a0: 65 20 6c 61 72 67 65 20 75 6e 69 6f 6e 2e 20 20  e large union.  
03b0: 54 68 65 20 75 6e 69 6f 6e 20 63 6f 6e 74 61 69  The union contai
03c0: 6e 73 0a 23 20 61 20 73 65 70 61 72 61 74 65 20  ns.# a separate 
03d0: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
03e0: 63 68 20 6f 70 63 6f 64 65 20 61 6e 64 20 74 68  ch opcode and th
03f0: 61 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  at structure con
0400: 74 61 69 6e 73 20 74 68 65 0a 23 20 6c 6f 63 61  tains the.# loca
0410: 6c 20 76 61 72 69 61 62 6c 65 73 20 75 73 65 64  l variables used
0420: 20 62 79 20 74 68 61 74 20 6f 70 63 6f 64 65 2e   by that opcode.
0430: 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 74    In this way, t
0440: 68 65 20 74 6f 74 61 6c 20 61 6d 6f 75 6e 74 0a  he total amount.
0450: 23 20 6f 66 20 73 74 61 63 6b 20 73 70 61 63 65  # of stack space
0460: 20 72 65 71 75 69 72 65 64 20 62 79 20 73 71 6c   required by sql
0470: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 20 69  ite3VdbeExec() i
0480: 73 20 72 65 64 75 63 65 64 20 66 72 6f 6d 20 74  s reduced from t
0490: 68 65 0a 23 20 73 75 6d 20 6f 66 20 61 6c 6c 20  he.# sum of all 
04a0: 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20  local variables 
04b0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  to the maximum o
04c0: 66 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 72 69  f the local vari
04d0: 61 62 6c 65 20 73 70 61 63 65 0a 23 20 72 65 71  able space.# req
04e0: 75 69 72 65 64 20 66 6f 72 20 61 6e 79 20 73 69  uired for any si
04f0: 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 0a 23 0a 23  ngle opcode..#.#
0500: 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   In order to be 
0510: 72 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74 68  recognized by th
0520: 69 73 20 73 63 72 69 70 74 2c 20 6c 6f 63 61 6c  is script, local
0530: 20 76 61 72 69 61 62 6c 65 73 20 6d 75 73 74 20   variables must 
0540: 61 70 70 65 61 72 0a 23 20 6f 6e 20 74 68 65 20  appear.# on the 
0550: 66 69 72 73 74 20 6c 69 6e 65 20 61 66 74 65 72  first line after
0560: 20 74 68 65 20 6f 70 65 6e 20 63 75 72 6c 79 2d   the open curly-
0570: 62 72 61 63 65 20 74 68 61 74 20 62 65 67 69 6e  brace that begin
0580: 73 20 61 20 6e 65 77 20 6f 70 63 6f 64 65 0a 23  s a new opcode.#
0590: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
05a0: 20 20 4c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65    Local variable
05b0: 73 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65 20  s must not have 
05c0: 69 6e 69 74 69 61 6c 69 7a 65 72 73 2c 20 74 68  initializers, th
05d0: 6f 75 67 68 20 74 68 65 79 0a 23 20 6d 61 79 20  ough they.# may 
05e0: 62 65 20 63 6f 6d 6d 65 6e 74 65 64 2e 0a 23 0a  be commented..#.
05f0: 23 20 54 68 65 20 75 6e 69 6f 6e 20 64 65 66 69  # The union defi
0600: 6e 69 74 69 6f 6e 20 69 73 20 69 6e 73 65 72 74  nition is insert
0610: 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
0620: 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
0630: 63 6f 6d 6d 65 6e 74 0a 23 20 69 6e 20 74 68 65  comment.# in the
0640: 20 70 72 65 61 6d 62 6c 65 20 74 6f 20 74 68 65   preamble to the
0650: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
0660: 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  () implementatio
0670: 6e 2e 0a 23 0a 23 23 23 23 23 23 23 23 23 23 23  n..#.###########
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 0a 23 0a 73 65 74 20 62 65 66 6f 72 65 55  ##.#.set beforeU
06d0: 6e 69 6f 6e 20 7b 7d 20 20 20 3b 23 20 43 20 63  nion {}   ;# C c
06e0: 6f 64 65 20 62 65 66 6f 72 65 20 75 6e 69 6f 6e  ode before union
06f0: 0a 73 65 74 20 75 6e 69 6f 6e 44 65 66 20 7b 7d  .set unionDef {}
0700: 20 20 20 20 20 20 3b 23 20 43 20 63 6f 64 65 20        ;# C code 
0710: 6f 66 20 74 68 65 20 75 6e 69 6f 6e 0a 73 65 74  of the union.set
0720: 20 61 66 74 65 72 55 6e 69 6f 6e 20 7b 7d 20 20   afterUnion {}  
0730: 20 20 3b 23 20 43 20 63 6f 64 65 20 61 66 74 65    ;# C code afte
0740: 72 20 74 68 65 20 75 6e 69 6f 6e 0a 73 65 74 20  r the union.set 
0750: 73 43 74 72 20 30 20 20 20 20 20 20 20 20 20 20  sCtr 0          
0760: 20 3b 23 20 43 6f 6e 74 65 78 74 20 63 6f 75 6e   ;# Context coun
0770: 74 65 72 0a 0a 23 20 52 65 61 64 20 70 72 6f 67  ter..# Read prog
0780: 72 61 6d 20 74 65 78 74 20 75 70 20 74 6f 20 74  ram text up to t
0790: 68 65 20 73 70 6f 74 20 77 68 65 72 65 20 74 68  he spot where th
07a0: 65 20 75 6e 69 6f 6e 20 73 68 6f 75 6c 64 20 62  e union should b
07b0: 65 0a 23 20 69 6e 73 65 72 74 65 64 2e 0a 23 0a  e.# inserted..#.
07c0: 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64  while {![eof std
07d0: 69 6e 5d 7d 20 7b 0a 20 20 73 65 74 20 6c 69 6e  in]} {.  set lin
07e0: 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 0a 20  e [gets stdin]. 
07f0: 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 49 4e   if {[regexp {IN
0800: 53 45 52 54 20 53 54 41 43 4b 20 55 4e 49 4f 4e  SERT STACK UNION
0810: 20 48 45 52 45 7d 20 24 6c 69 6e 65 5d 7d 20 62   HERE} $line]} b
0820: 72 65 61 6b 0a 20 20 61 70 70 65 6e 64 20 62 65  reak.  append be
0830: 66 6f 72 65 55 6e 69 6f 6e 20 24 6c 69 6e 65 5c  foreUnion $line\
0840: 6e 0a 7d 0a 0a 23 20 50 72 6f 63 65 73 73 20 74  n.}..# Process t
0850: 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 65 78  he remaining tex
0860: 74 2e 20 20 42 75 69 6c 64 20 75 70 20 74 68 65  t.  Build up the
0870: 20 75 6e 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f   union definitio
0880: 6e 20 61 73 20 77 65 20 67 6f 2e 0a 23 0a 73 65  n as we go..#.se
0890: 74 20 76 6c 69 73 74 20 7b 7d 0a 73 65 74 20 73  t vlist {}.set s
08a0: 65 65 6e 44 65 63 6c 20 30 0a 73 65 74 20 6e 61  eenDecl 0.set na
08b0: 6d 65 63 68 61 72 73 20 7b 61 62 63 64 65 66 67  mechars {abcdefg
08c0: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
08d0: 78 79 7a 7d 0a 73 65 74 20 6e 6e 63 20 5b 73 74  xyz}.set nnc [st
08e0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d  ring length $nam
08f0: 65 63 68 61 72 73 5d 0a 77 68 69 6c 65 20 7b 21  echars].while {!
0900: 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 0a 20  [eof stdin]} {. 
0910: 20 73 65 74 20 6c 69 6e 65 20 5b 67 65 74 73 20   set line [gets 
0920: 73 74 64 69 6e 5d 0a 20 20 69 66 20 7b 5b 72 65  stdin].  if {[re
0930: 67 65 78 70 20 22 5e 63 61 73 65 20 28 4f 50 5f  gexp "^case (OP_
0940: 5c 5c 77 2b 29 3a 20 5c 31 37 33 22 20 24 6c 69  \\w+): \173" $li
0950: 6e 65 20 61 6c 6c 20 6f 70 65 72 61 74 6f 72 5d  ne all operator]
0960: 7d 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 20 61  } {.    append a
0970: 66 74 65 72 55 6e 69 6f 6e 20 24 6c 69 6e 65 5c  fterUnion $line\
0980: 6e 0a 20 20 20 20 73 65 74 20 76 6c 69 73 74 20  n.    set vlist 
0990: 7b 7d 0a 20 20 20 20 77 68 69 6c 65 20 7b 21 5b  {}.    while {![
09a0: 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 0a 20 20  eof stdin]} {.  
09b0: 20 20 20 20 73 65 74 20 6c 69 6e 65 20 5b 67 65      set line [ge
09c0: 74 73 20 73 74 64 69 6e 5d 0a 20 20 20 20 20 20  ts stdin].      
09d0: 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 20 2b  if {[regexp {^ +
09e0: 28 63 6f 6e 73 74 20 29 3f 5c 77 2b 20 5c 2a 2a  (const )?\w+ \**
09f0: 28 5c 77 2b 29 28 5c 5b 2e 2a 5c 5d 29 3f 3b 7d  (\w+)(\[.*\])?;}
0a00: 20 24 6c 69 6e 65 20 5c 0a 20 20 20 20 20 20 20   $line \.       
0a10: 20 20 20 20 61 6c 6c 20 63 6f 6e 73 74 4b 65 79      all constKey
0a20: 77 6f 72 64 20 76 6e 61 6d 65 20 6e 6f 74 75 73  word vname notus
0a30: 65 64 31 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20  ed1]} {.        
0a40: 69 66 20 7b 21 24 73 65 65 6e 44 65 63 6c 7d 20  if {!$seenDecl} 
0a50: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  {.          set 
0a60: 73 6e 61 6d 65 20 7b 7d 0a 20 20 20 20 20 20 20  sname {}.       
0a70: 20 20 20 61 70 70 65 6e 64 20 73 6e 61 6d 65 20     append sname 
0a80: 5b 73 74 72 69 6e 67 20 69 6e 64 65 78 20 24 6e  [string index $n
0a90: 61 6d 65 63 68 61 72 73 20 5b 65 78 70 72 20 7b  amechars [expr {
0aa0: 24 73 43 74 72 2f 24 6e 6e 63 7d 5d 5d 0a 20 20  $sCtr/$nnc}]].  
0ab0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 73          append s
0ac0: 6e 61 6d 65 20 5b 73 74 72 69 6e 67 20 69 6e 64  name [string ind
0ad0: 65 78 20 24 6e 61 6d 65 63 68 61 72 73 20 5b 65  ex $namechars [e
0ae0: 78 70 72 20 7b 24 73 43 74 72 25 24 6e 6e 63 7d  xpr {$sCtr%$nnc}
0af0: 5d 5d 0a 20 20 20 20 20 20 20 20 20 20 69 6e 63  ]].          inc
0b00: 72 20 73 43 74 72 0a 20 20 20 20 20 20 20 20 20  r sCtr.         
0b10: 20 61 70 70 65 6e 64 20 75 6e 69 6f 6e 44 65 66   append unionDef
0b20: 20 22 20 20 20 20 73 74 72 75 63 74 20 24 7b 6f   "    struct ${o
0b30: 70 65 72 61 74 6f 72 7d 5f 73 74 61 63 6b 5f 76  perator}_stack_v
0b40: 61 72 73 20 5c 31 37 33 5c 6e 22 0a 20 20 20 20  ars \173\n".    
0b50: 20 20 20 20 20 20 61 70 70 65 6e 64 20 61 66 74        append aft
0b60: 65 72 55 6e 69 6f 6e 20 5c 0a 20 20 20 20 20 20  erUnion \.      
0b70: 20 20 20 20 20 20 20 22 23 69 66 20 30 20 20 2f         "#if 0  /
0b80: 2a 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  * local variable
0b90: 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 75 2e 24  s moved into u.$
0ba0: 73 6e 61 6d 65 20 2a 2f 5c 6e 22 0a 20 20 20 20  sname */\n".    
0bb0: 20 20 20 20 20 20 73 65 74 20 73 65 65 6e 44 65        set seenDe
0bc0: 63 6c 20 31 0a 20 20 20 20 20 20 20 20 7d 0a 20  cl 1.        }. 
0bd0: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 75 6e         append un
0be0: 69 6f 6e 44 65 66 20 22 20 20 20 20 24 6c 69 6e  ionDef "    $lin
0bf0: 65 5c 6e 22 0a 20 20 20 20 20 20 20 20 61 70 70  e\n".        app
0c00: 65 6e 64 20 61 66 74 65 72 55 6e 69 6f 6e 20 24  end afterUnion $
0c10: 6c 69 6e 65 5c 6e 0a 20 20 20 20 20 20 20 20 6c  line\n.        l
0c20: 61 70 70 65 6e 64 20 76 6c 69 73 74 20 24 76 6e  append vlist $vn
0c30: 61 6d 65 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ame.      } else
0c40: 20 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   {.        break
0c50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
0c60: 20 20 20 69 66 20 7b 24 73 65 65 6e 44 65 63 6c     if {$seenDecl
0c70: 7d 20 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64  } {.      append
0c80: 20 75 6e 69 6f 6e 44 65 66 20 20 20 22 20 20 20   unionDef   "   
0c90: 20 5c 31 37 35 20 24 73 6e 61 6d 65 3b 5c 6e 22   \175 $sname;\n"
0ca0: 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20 61 66  .      append af
0cb0: 74 65 72 55 6e 69 6f 6e 20 22 23 65 6e 64 69 66  terUnion "#endif
0cc0: 20 2f 2a 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   /* local variab
0cd0: 6c 65 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 75  les moved into u
0ce0: 2e 24 73 6e 61 6d 65 20 2a 2f 5c 6e 22 0a 20 20  .$sname */\n".  
0cf0: 20 20 7d 0a 20 20 20 20 73 65 74 20 73 65 65 6e    }.    set seen
0d00: 44 65 63 6c 20 30 0a 20 20 7d 0a 20 20 69 66 20  Decl 0.  }.  if 
0d10: 7b 5b 72 65 67 65 78 70 20 22 5e 5c 31 37 35 22  {[regexp "^\175"
0d20: 20 24 6c 69 6e 65 5d 7d 20 7b 0a 20 20 20 20 61   $line]} {.    a
0d30: 70 70 65 6e 64 20 61 66 74 65 72 55 6e 69 6f 6e  ppend afterUnion
0d40: 20 24 6c 69 6e 65 5c 6e 0a 20 20 20 20 73 65 74   $line\n.    set
0d50: 20 76 6c 69 73 74 20 7b 7d 0a 20 20 7d 20 65 6c   vlist {}.  } el
0d60: 73 65 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  seif {[llength $
0d70: 76 6c 69 73 74 5d 3e 30 7d 20 7b 0a 20 20 20 20  vlist]>0} {.    
0d80: 61 70 70 65 6e 64 20 6c 69 6e 65 20 22 20 22 0a  append line " ".
0d90: 20 20 20 20 66 6f 72 65 61 63 68 20 76 20 24 76      foreach v $v
0da0: 6c 69 73 74 20 7b 0a 20 20 20 20 20 20 72 65 67  list {.      reg
0db0: 73 75 62 20 2d 61 6c 6c 20 22 28 5c 5b 5e 61 2d  sub -all "(\[^a-
0dc0: 7a 41 2d 5a 30 2d 39 3e 2e 5c 5d 29 24 7b 76 7d  zA-Z0-9>.\])${v}
0dd0: 28 5c 5c 57 29 22 20 24 6c 69 6e 65 20 22 5c 5c  (\\W)" $line "\\
0de0: 31 75 2e 24 73 6e 61 6d 65 2e 24 76 5c 5c 32 22  1u.$sname.$v\\2"
0df0: 20 6c 69 6e 65 0a 20 20 20 20 20 20 72 65 67 73   line.      regs
0e00: 75 62 20 2d 61 6c 6c 20 22 28 5c 5b 5e 61 2d 7a  ub -all "(\[^a-z
0e10: 41 2d 5a 30 2d 39 3e 2e 5c 5d 29 24 7b 76 7d 28  A-Z0-9>.\])${v}(
0e20: 5c 5c 57 29 22 20 24 6c 69 6e 65 20 22 5c 5c 31  \\W)" $line "\\1
0e30: 75 2e 24 73 6e 61 6d 65 2e 24 76 5c 5c 32 22 20  u.$sname.$v\\2" 
0e40: 6c 69 6e 65 0a 20 20 20 20 7d 0a 20 20 20 20 61  line.    }.    a
0e50: 70 70 65 6e 64 20 61 66 74 65 72 55 6e 69 6f 6e  ppend afterUnion
0e60: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 72 69 67   [string trimrig
0e70: 68 74 20 24 6c 69 6e 65 5d 5c 6e 0a 20 20 7d 20  ht $line]\n.  } 
0e80: 65 6c 73 65 69 66 20 7b 24 6c 69 6e 65 3d 3d 22  elseif {$line=="
0e90: 22 20 26 26 20 5b 65 6f 66 20 73 74 64 69 6e 5d  " && [eof stdin]
0ea0: 7d 20 7b 0a 20 20 20 20 23 20 6e 6f 2d 6f 70 0a  } {.    # no-op.
0eb0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 61    } else {.    a
0ec0: 70 70 65 6e 64 20 61 66 74 65 72 55 6e 69 6f 6e  ppend afterUnion
0ed0: 20 24 6c 69 6e 65 5c 6e 0a 20 20 7d 0a 7d 0a 0a   $line\n.  }.}..
0ee0: 23 20 4f 75 74 70 75 74 20 74 68 65 20 72 65 73  # Output the res
0ef0: 75 6c 74 69 6e 67 20 74 65 78 74 2e 0a 23 0a 70  ulting text..#.p
0f00: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24  uts -nonewline $
0f10: 62 65 66 6f 72 65 55 6e 69 6f 6e 0a 70 75 74 73  beforeUnion.puts
0f20: 20 22 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   "  /***********
0f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 22 0a 70 75 74 73 20  *********".puts 
0f70: 22 20 20 2a 2a 20 41 75 74 6f 6d 61 74 69 63 61  "  ** Automatica
0f80: 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20 63 6f  lly generated co
0f90: 64 65 22 0a 70 75 74 73 20 22 20 20 2a 2a 22 0a  de".puts "  **".
0fa0: 70 75 74 73 20 22 20 20 2a 2a 20 54 68 65 20 66  puts "  ** The f
0fb0: 6f 6c 6c 6f 77 69 6e 67 20 75 6e 69 6f 6e 20 69  ollowing union i
0fc0: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
0fd0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
0fe0: 22 0a 70 75 74 73 20 22 20 20 2a 2a 20 76 64 62  ".puts "  ** vdb
0ff0: 65 2d 63 6f 6d 70 72 65 73 73 2e 74 63 6c 20 73  e-compress.tcl s
1000: 63 72 69 70 74 2e 20 20 54 68 65 20 70 75 72 70  cript.  The purp
1010: 6f 73 65 20 6f 66 20 74 68 69 73 20 75 6e 69 6f  ose of this unio
1020: 6e 20 69 73 20 74 6f 22 0a 70 75 74 73 20 22 20  n is to".puts " 
1030: 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61   ** reduce the a
1040: 6d 6f 75 6e 74 20 6f 66 20 73 74 61 63 6b 20 73  mount of stack s
1050: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 62 79  pace required by
1060: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 22   this function."
1070: 0a 70 75 74 73 20 22 20 20 2a 2a 20 53 65 65 20  .puts "  ** See 
1080: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  comments in the 
1090: 76 64 62 65 2d 63 6f 6d 70 72 65 73 73 2e 74 63  vdbe-compress.tc
10a0: 6c 20 73 63 72 69 70 74 20 66 6f 72 20 64 65 74  l script for det
10b0: 61 69 6c 73 2e 22 0a 70 75 74 73 20 22 20 20 2a  ails.".puts "  *
10c0: 2f 22 0a 70 75 74 73 20 22 20 20 75 6e 69 6f 6e  /".puts "  union
10d0: 20 76 64 62 65 45 78 65 63 55 6e 69 6f 6e 20 5c   vdbeExecUnion \
10e0: 31 37 33 22 0a 70 75 74 73 20 2d 6e 6f 6e 65 77  173".puts -nonew
10f0: 6c 69 6e 65 20 24 75 6e 69 6f 6e 44 65 66 0a 70  line $unionDef.p
1100: 75 74 73 20 22 20 20 5c 31 37 35 20 75 3b 22 0a  uts "  \175 u;".
1110: 70 75 74 73 20 22 20 20 2f 2a 20 45 6e 64 20 61  puts "  /* End a
1120: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
1130: 65 72 61 74 65 64 20 63 6f 64 65 22 0a 70 75 74  erated code".put
1140: 73 20 22 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s "  ***********
1150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 22 0a 70 75 74 73  *********/".puts
1190: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 61 66 74   -nonewline $aft
11a0: 65 72 55 6e 69 6f 6e 0a                          erUnion.