/ Hex Artifact Content
Login

Artifact f26595dfcc342f4ea8b2e703686c2352638ed578e20acfc3e6534d30bbd4f555:


0000: 2f 2a 0a 2a 2a 20 32 30 31 31 2d 30 37 2d 30 39  /*.** 2011-07-09
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace 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 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e  ** This file con
0180: 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 74  tains code for t
0190: 68 65 20 56 64 62 65 53 6f 72 74 65 72 20 6f 62  he VdbeSorter ob
01a0: 6a 65 63 74 2c 20 75 73 65 64 20 69 6e 20 63 6f  ject, used in co
01b0: 6e 63 65 72 74 20 77 69 74 68 0a 2a 2a 20 61 20  ncert with.** a 
01c0: 56 64 62 65 43 75 72 73 6f 72 20 74 6f 20 73 6f  VdbeCursor to so
01d0: 72 74 20 6c 61 72 67 65 20 6e 75 6d 62 65 72 73  rt large numbers
01e0: 20 6f 66 20 6b 65 79 73 20 66 6f 72 20 43 52 45   of keys for CRE
01f0: 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
0200: 65 6e 74 73 0a 2a 2a 20 6f 72 20 62 79 20 53 45  ents.** or by SE
0210: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
0220: 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 63 6c  with ORDER BY cl
0230: 61 75 73 65 73 20 74 68 61 74 20 63 61 6e 6e 6f  auses that canno
0240: 74 20 62 65 20 73 61 74 69 73 66 69 65 64 0a 2a  t be satisfied.*
0250: 2a 20 75 73 69 6e 67 20 69 6e 64 65 78 65 73 20  * using indexes 
0260: 61 6e 64 20 77 69 74 68 6f 75 74 20 4c 49 4d 49  and without LIMI
0270: 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
0280: 20 54 68 65 20 56 64 62 65 53 6f 72 74 65 72 20   The VdbeSorter 
0290: 6f 62 6a 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74  object implement
02a0: 73 20 61 20 6d 75 6c 74 69 2d 74 68 72 65 61 64  s a multi-thread
02b0: 65 64 20 65 78 74 65 72 6e 61 6c 20 6d 65 72 67  ed external merg
02c0: 65 20 73 6f 72 74 0a 2a 2a 20 61 6c 67 6f 72 69  e sort.** algori
02d0: 74 68 6d 20 74 68 61 74 20 69 73 20 65 66 66 69  thm that is effi
02e0: 63 69 65 6e 74 20 65 76 65 6e 20 69 66 20 74 68  cient even if th
02f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
0300: 65 6e 74 73 20 62 65 69 6e 67 20 73 6f 72 74 65  ents being sorte
0310: 64 0a 2a 2a 20 65 78 63 65 65 64 73 20 74 68 65  d.** exceeds the
0320: 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72   available memor
0330: 79 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73  y..**.** Here is
0340: 20 74 68 65 20 28 69 6e 74 65 72 6e 61 6c 2c 20   the (internal, 
0350: 6e 6f 6e 2d 41 50 49 29 20 69 6e 74 65 72 66 61  non-API) interfa
0360: 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
0370: 6d 6f 64 75 6c 65 20 61 6e 64 20 74 68 65 0a 2a  module and the.*
0380: 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 53 51  * rest of the SQ
0390: 4c 69 74 65 20 73 79 73 74 65 6d 3a 0a 2a 2a 0a  Lite system:.**.
03a0: 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  **    sqlite3Vdb
03b0: 65 53 6f 72 74 65 72 49 6e 69 74 28 29 20 20 20  eSorterInit()   
03c0: 20 20 20 20 43 72 65 61 74 65 20 61 20 6e 65 77      Create a new
03d0: 20 56 64 62 65 53 6f 72 74 65 72 20 6f 62 6a 65   VdbeSorter obje
03e0: 63 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c  ct..**.**    sql
03f0: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 57 72  ite3VdbeSorterWr
0400: 69 74 65 28 29 20 20 20 20 20 20 41 64 64 20 61  ite()      Add a
0410: 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 6f 77 20   single new row 
0420: 74 6f 20 74 68 65 20 56 64 62 65 53 6f 72 74 65  to the VdbeSorte
0430: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0450: 20 20 20 20 20 20 6f 62 6a 65 63 74 2e 20 20 54        object.  T
0460: 68 65 20 72 6f 77 20 69 73 20 61 20 62 69 6e 61  he row is a bina
0470: 72 79 20 62 6c 6f 62 20 69 6e 20 74 68 65 0a 2a  ry blob in the.*
0480: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04a0: 20 20 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64     OP_MakeRecord
04b0: 20 66 6f 72 6d 61 74 20 74 68 61 74 20 63 6f 6e   format that con
04c0: 74 61 69 6e 73 20 62 6f 74 68 0a 2a 2a 20 20 20  tains both.**   
04d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
04f0: 68 65 20 4f 52 44 45 52 20 42 59 20 6b 65 79 20  he ORDER BY key 
0500: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 72 65 73 75  columns and resu
0510: 6c 74 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20  lt columns.**   
0520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
0540: 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20  n the case of a 
0550: 53 45 4c 45 43 54 20 77 2f 20 4f 52 44 45 52 20  SELECT w/ ORDER 
0560: 42 59 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  BY, or.**       
0570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0580: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 63             the c
0590: 6f 6d 70 6c 65 74 65 20 72 65 63 6f 72 64 20 66  omplete record f
05a0: 6f 72 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  or an index entr
05b0: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
05c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05d0: 20 20 20 20 20 20 69 6e 20 74 68 65 20 63 61 73        in the cas
05e0: 65 20 6f 66 20 61 20 43 52 45 41 54 45 20 49 4e  e of a CREATE IN
05f0: 44 45 58 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71  DEX..**.**    sq
0600: 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 52  lite3VdbeSorterR
0610: 65 77 69 6e 64 28 29 20 20 20 20 20 53 6f 72 74  ewind()     Sort
0620: 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 70 72 65   all content pre
0630: 76 69 6f 75 73 6c 79 20 61 64 64 65 64 2e 0a 2a  viously added..*
0640: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0660: 20 20 20 50 6f 73 69 74 69 6f 6e 20 74 68 65 20     Position the 
0670: 72 65 61 64 20 63 75 72 73 6f 72 20 6f 6e 20 74  read cursor on t
0680: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06a0: 20 20 20 20 20 20 20 66 69 72 73 74 20 73 6f 72         first sor
06b0: 74 65 64 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2a 0a  ted element..**.
06c0: 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  **    sqlite3Vdb
06d0: 65 53 6f 72 74 65 72 4e 65 78 74 28 29 20 20 20  eSorterNext()   
06e0: 20 20 20 20 41 64 76 61 6e 63 65 20 74 68 65 20      Advance the 
06f0: 72 65 61 64 20 63 75 72 73 6f 72 20 74 6f 20 74  read cursor to t
0700: 68 65 20 6e 65 78 74 20 73 6f 72 74 65 64 0a 2a  he next sorted.*
0710: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0730: 20 20 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a     element..**.*
0740: 2a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  *    sqlite3Vdbe
0750: 53 6f 72 74 65 72 52 6f 77 6b 65 79 28 29 20 20  SorterRowkey()  
0760: 20 20 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f     Return the co
0770: 6d 70 6c 65 74 65 20 62 69 6e 61 72 79 20 62 6c  mplete binary bl
0780: 6f 62 20 66 6f 72 20 74 68 65 0a 2a 2a 20 20 20  ob for the.**   
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
07b0: 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ow currently und
07c0: 65 72 20 74 68 65 20 72 65 61 64 20 63 75 72 73  er the read curs
07d0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c  or..**.**    sql
07e0: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6f  ite3VdbeSorterCo
07f0: 6d 70 61 72 65 28 29 20 20 20 20 43 6f 6d 70 61  mpare()    Compa
0800: 72 65 20 74 68 65 20 62 69 6e 61 72 79 20 62 6c  re the binary bl
0810: 6f 62 20 66 6f 72 20 74 68 65 20 72 6f 77 0a 2a  ob for the row.*
0820: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0840: 20 20 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64     currently und
0850: 65 72 20 74 68 65 20 72 65 61 64 20 63 75 72 73  er the read curs
0860: 6f 72 20 61 67 61 69 6e 73 74 0a 2a 2a 20 20 20  or against.**   
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0890: 6e 6f 74 68 65 72 20 62 69 6e 61 72 79 20 62 6c  nother binary bl
08a0: 6f 62 20 58 20 61 6e 64 20 72 65 70 6f 72 74 20  ob X and report 
08b0: 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  if.**           
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08d0: 20 20 20 20 20 20 20 58 20 69 73 20 73 74 72 69         X is stri
08e0: 63 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 74  ctly less than t
08f0: 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 2e 0a  he read cursor..
0900: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 20 20 20 20 55 73 65 64 20 74 6f 20 65 6e 66 6f      Used to enfo
0930: 72 63 65 20 75 6e 69 71 75 65 6e 65 73 73 20 69  rce uniqueness i
0940: 6e 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  n a.**          
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 55          CREATE U
0970: 4e 49 51 55 45 20 49 4e 44 45 58 20 73 74 61 74  NIQUE INDEX stat
0980: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
0990: 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
09a0: 72 43 6c 6f 73 65 28 29 20 20 20 20 20 20 43 6c  rClose()      Cl
09b0: 6f 73 65 20 74 68 65 20 56 64 62 65 53 6f 72 74  ose the VdbeSort
09c0: 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  er object and re
09d0: 63 6c 61 69 6d 0a 2a 2a 20 20 20 20 20 20 20 20  claim.**        
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09f0: 20 20 20 20 20 20 20 20 20 20 61 6c 6c 20 72 65            all re
0a00: 73 6f 75 72 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  sources..**.**  
0a10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72    sqlite3VdbeSor
0a20: 74 65 72 52 65 73 65 74 28 29 20 20 20 20 20 20  terReset()      
0a30: 52 65 66 75 72 62 69 73 68 20 74 68 65 20 56 64  Refurbish the Vd
0a40: 62 65 53 6f 72 74 65 72 20 66 6f 72 20 72 65 75  beSorter for reu
0a50: 73 65 2e 20 20 54 68 69 73 0a 2a 2a 20 20 20 20  se.  This.**    
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
0a80: 20 6c 69 6b 65 20 43 6c 6f 73 65 28 29 20 66 6f   like Close() fo
0a90: 6c 6c 6f 77 65 64 20 62 79 20 49 6e 69 74 28 29  llowed by Init()
0aa0: 20 6f 6e 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20   only.**        
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 20 20 20 20 20 20 20 20 6d 75 63 68 20 66            much f
0ad0: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  aster..**.** The
0ae0: 20 69 6e 74 65 72 66 61 63 65 73 20 61 62 6f 76   interfaces abov
0af0: 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
0b00: 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   in a particular
0b10: 20 6f 72 64 65 72 2e 20 20 57 72 69 74 65 28 29   order.  Write()
0b20: 20 63 61 6e 20 0a 2a 2a 20 6f 6e 6c 79 20 6f 63   can .** only oc
0b30: 63 75 72 20 69 6e 20 62 65 74 77 65 65 6e 20 49  cur in between I
0b40: 6e 69 74 28 29 2f 52 65 73 65 74 28 29 20 61 6e  nit()/Reset() an
0b50: 64 20 52 65 77 69 6e 64 28 29 2e 20 20 4e 65 78  d Rewind().  Nex
0b60: 74 28 29 2c 20 52 6f 77 6b 65 79 28 29 2c 20 61  t(), Rowkey(), a
0b70: 6e 64 0a 2a 2a 20 43 6f 6d 70 61 72 65 28 29 20  nd.** Compare() 
0b80: 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  can only occur i
0b90: 6e 20 62 65 74 77 65 65 6e 20 52 65 77 69 6e 64  n between Rewind
0ba0: 28 29 20 61 6e 64 20 43 6c 6f 73 65 28 29 2f 52  () and Close()/R
0bb0: 65 73 65 74 28 29 2e 20 69 2e 65 2e 0a 2a 2a 0a  eset(). i.e..**.
0bc0: 2a 2a 20 20 20 49 6e 69 74 28 29 0a 2a 2a 20 20  **   Init().**  
0bd0: 20 66 6f 72 20 65 61 63 68 20 72 65 63 6f 72 64   for each record
0be0: 3a 20 57 72 69 74 65 28 29 0a 2a 2a 20 20 20 52  : Write().**   R
0bf0: 65 77 69 6e 64 28 29 0a 2a 2a 20 20 20 20 20 52  ewind().**     R
0c00: 6f 77 6b 65 79 28 29 2f 43 6f 6d 70 61 72 65 28  owkey()/Compare(
0c10: 29 0a 2a 2a 20 20 20 4e 65 78 74 28 29 20 0a 2a  ).**   Next() .*
0c20: 2a 20 20 20 43 6c 6f 73 65 28 29 0a 2a 2a 0a 2a  *   Close().**.*
0c30: 2a 20 41 6c 67 6f 72 69 74 68 6d 3a 0a 2a 2a 0a  * Algorithm:.**.
0c40: 2a 2a 20 52 65 63 6f 72 64 73 20 70 61 73 73 65  ** Records passe
0c50: 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20  d to the sorter 
0c60: 76 69 61 20 63 61 6c 6c 73 20 74 6f 20 57 72 69  via calls to Wri
0c70: 74 65 28 29 20 61 72 65 20 69 6e 69 74 69 61 6c  te() are initial
0c80: 6c 79 20 68 65 6c 64 20 0a 2a 2a 20 75 6e 73 6f  ly held .** unso
0c90: 72 74 65 64 20 69 6e 20 6d 61 69 6e 20 6d 65 6d  rted in main mem
0ca0: 6f 72 79 2e 20 41 73 73 75 6d 69 6e 67 20 74 68  ory. Assuming th
0cb0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f  e amount of memo
0cc0: 72 79 20 75 73 65 64 20 6e 65 76 65 72 20 65 78  ry used never ex
0cd0: 63 65 65 64 73 0a 2a 2a 20 61 20 74 68 72 65 73  ceeds.** a thres
0ce0: 68 6f 6c 64 2c 20 77 68 65 6e 20 52 65 77 69 6e  hold, when Rewin
0cf0: 64 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 68  d() is called th
0d00: 65 20 73 65 74 20 6f 66 20 72 65 63 6f 72 64 73  e set of records
0d10: 20 69 73 20 73 6f 72 74 65 64 20 75 73 69 6e 67   is sorted using
0d20: 0a 2a 2a 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  .** an in-memory
0d30: 20 6d 65 72 67 65 20 73 6f 72 74 2e 20 49 6e 20   merge sort. In 
0d40: 74 68 69 73 20 63 61 73 65 2c 20 6e 6f 20 74 65  this case, no te
0d50: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
0d60: 65 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 61 6e  e required.** an
0d70: 64 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  d subsequent cal
0d80: 6c 73 20 74 6f 20 52 6f 77 6b 65 79 28 29 2c 20  ls to Rowkey(), 
0d90: 4e 65 78 74 28 29 20 61 6e 64 20 43 6f 6d 70 61  Next() and Compa
0da0: 72 65 28 29 20 72 65 61 64 20 72 65 63 6f 72 64  re() read record
0db0: 73 20 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 66  s .** directly f
0dc0: 72 6f 6d 20 6d 61 69 6e 20 6d 65 6d 6f 72 79 2e  rom main memory.
0dd0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 6d  .**.** If the am
0de0: 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 75 73  ount of space us
0df0: 65 64 20 74 6f 20 73 74 6f 72 65 20 72 65 63 6f  ed to store reco
0e00: 72 64 73 20 69 6e 20 6d 61 69 6e 20 6d 65 6d 6f  rds in main memo
0e10: 72 79 20 65 78 63 65 65 64 73 20 74 68 65 0a 2a  ry exceeds the.*
0e20: 2a 20 74 68 72 65 73 68 6f 6c 64 2c 20 74 68 65  * threshold, the
0e30: 6e 20 74 68 65 20 73 65 74 20 6f 66 20 72 65 63  n the set of rec
0e40: 6f 72 64 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ords currently i
0e50: 6e 20 6d 65 6d 6f 72 79 20 61 72 65 20 73 6f 72  n memory are sor
0e60: 74 65 64 20 61 6e 64 0a 2a 2a 20 77 72 69 74 74  ted and.** writt
0e70: 65 6e 20 74 6f 20 61 20 74 65 6d 70 6f 72 61 72  en to a temporar
0e80: 79 20 66 69 6c 65 20 69 6e 20 22 50 61 63 6b 65  y file in "Packe
0e90: 64 20 4d 65 6d 6f 72 79 20 41 72 72 61 79 22 20  d Memory Array" 
0ea0: 28 50 4d 41 29 20 66 6f 72 6d 61 74 2e 0a 2a 2a  (PMA) format..**
0eb0: 20 41 20 50 4d 41 20 63 72 65 61 74 65 64 20 61   A PMA created a
0ec0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20  t this point is 
0ed0: 6b 6e 6f 77 6e 20 61 73 20 61 20 22 6c 65 76 65  known as a "leve
0ee0: 6c 2d 30 20 50 4d 41 22 2e 20 48 69 67 68 65 72  l-0 PMA". Higher
0ef0: 20 6c 65 76 65 6c 73 0a 2a 2a 20 6f 66 20 50 4d   levels.** of PM
0f00: 41 73 20 6d 61 79 20 62 65 20 63 72 65 61 74 65  As may be create
0f10: 64 20 62 79 20 6d 65 72 67 69 6e 67 20 65 78 69  d by merging exi
0f20: 73 74 69 6e 67 20 50 4d 41 73 20 74 6f 67 65 74  sting PMAs toget
0f30: 68 65 72 20 2d 20 66 6f 72 20 65 78 61 6d 70 6c  her - for exampl
0f40: 65 0a 2a 2a 20 6d 65 72 67 69 6e 67 20 74 77 6f  e.** merging two
0f50: 20 6f 72 20 6d 6f 72 65 20 6c 65 76 65 6c 2d 30   or more level-0
0f60: 20 50 4d 41 73 20 74 6f 67 65 74 68 65 72 20 63   PMAs together c
0f70: 72 65 61 74 65 73 20 61 20 6c 65 76 65 6c 2d 31  reates a level-1
0f80: 20 50 4d 41 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   PMA..**.** The 
0f90: 74 68 72 65 73 68 6f 6c 64 20 66 6f 72 20 74 68  threshold for th
0fa0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 61 69 6e  e amount of main
0fb0: 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73 65 20 62   memory to use b
0fc0: 65 66 6f 72 65 20 66 6c 75 73 68 69 6e 67 20 0a  efore flushing .
0fd0: 2a 2a 20 72 65 63 6f 72 64 73 20 74 6f 20 61 20  ** records to a 
0fe0: 50 4d 41 20 69 73 20 72 6f 75 67 68 6c 79 20 74  PMA is roughly t
0ff0: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6c  he same as the l
1000: 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20  imit configured 
1010: 66 6f 72 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  for the.** page-
1020: 63 61 63 68 65 20 6f 66 20 74 68 65 20 6d 61 69  cache of the mai
1030: 6e 20 64 61 74 61 62 61 73 65 2e 20 53 70 65 63  n database. Spec
1040: 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 74 68  ifically, the th
1050: 72 65 73 68 6f 6c 64 20 69 73 20 73 65 74 20 74  reshold is set t
1060: 6f 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  o .** the value 
1070: 72 65 74 75 72 6e 65 64 20 62 79 20 22 50 52 41  returned by "PRA
1080: 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69  GMA main.page_si
1090: 7a 65 22 20 6d 75 6c 74 69 70 6c 65 64 20 62 79  ze" multipled by
10a0: 20 0a 2a 2a 20 74 68 61 74 20 72 65 74 75 72 6e   .** that return
10b0: 65 64 20 62 79 20 22 50 52 41 47 4d 41 20 6d 61  ed by "PRAGMA ma
10c0: 69 6e 2e 63 61 63 68 65 5f 73 69 7a 65 22 2c 20  in.cache_size", 
10d0: 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
10e0: 49 66 20 74 68 65 20 73 6f 72 74 65 72 20 69 73  If the sorter is
10f0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 69 6e 67   running in sing
1100: 6c 65 2d 74 68 72 65 61 64 65 64 20 6d 6f 64 65  le-threaded mode
1110: 2c 20 74 68 65 6e 20 61 6c 6c 20 50 4d 41 73 20  , then all PMAs 
1120: 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 61 72 65  generated.** are
1130: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 73   appended to a s
1140: 69 6e 67 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  ingle temporary 
1150: 66 69 6c 65 2e 20 4f 72 2c 20 69 66 20 74 68 65  file. Or, if the
1160: 20 73 6f 72 74 65 72 20 69 73 20 72 75 6e 6e 69   sorter is runni
1170: 6e 67 20 69 6e 0a 2a 2a 20 6d 75 6c 74 69 2d 74  ng in.** multi-t
1180: 68 72 65 61 64 65 64 20 6d 6f 64 65 20 74 68 65  hreaded mode the
1190: 6e 20 75 70 20 74 6f 20 28 4e 2b 31 29 20 74 65  n up to (N+1) te
11a0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 6d 61  mporary files ma
11b0: 79 20 62 65 20 6f 70 65 6e 65 64 2c 20 77 68 65  y be opened, whe
11c0: 72 65 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 63  re.** N is the c
11d0: 6f 6e 66 69 67 75 72 65 64 20 6e 75 6d 62 65 72  onfigured number
11e0: 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61   of worker threa
11f0: 64 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ds. In this case
1200: 2c 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  , instead of.** 
1210: 73 6f 72 74 69 6e 67 20 74 68 65 20 72 65 63 6f  sorting the reco
1220: 72 64 73 20 61 6e 64 20 77 72 69 74 69 6e 67 20  rds and writing 
1230: 74 68 65 20 50 4d 41 20 74 6f 20 61 20 74 65 6d  the PMA to a tem
1240: 70 6f 72 61 72 79 20 66 69 6c 65 20 69 74 73 65  porary file itse
1250: 6c 66 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69  lf, the.** calli
1260: 6e 67 20 74 68 72 65 61 64 20 75 73 75 61 6c 6c  ng thread usuall
1270: 79 20 6c 61 75 6e 63 68 65 73 20 61 20 77 6f 72  y launches a wor
1280: 6b 65 72 20 74 68 72 65 61 64 20 74 6f 20 64 6f  ker thread to do
1290: 20 73 6f 2e 20 45 78 63 65 70 74 2c 20 69 66 0a   so. Except, if.
12a0: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  ** there are alr
12b0: 65 61 64 79 20 4e 20 77 6f 72 6b 65 72 20 74 68  eady N worker th
12c0: 72 65 61 64 73 20 72 75 6e 6e 69 6e 67 2c 20 74  reads running, t
12d0: 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64 20 64  he main thread d
12e0: 6f 65 73 20 74 68 65 20 77 6f 72 6b 0a 2a 2a 20  oes the work.** 
12f0: 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  itself..**.** Th
1300: 65 20 73 6f 72 74 65 72 20 69 73 20 72 75 6e 6e  e sorter is runn
1310: 69 6e 67 20 69 6e 20 6d 75 6c 74 69 2d 74 68 72  ing in multi-thr
1320: 65 61 64 65 64 20 6d 6f 64 65 20 69 66 20 28 61  eaded mode if (a
1330: 29 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61  ) the library wa
1340: 73 20 62 75 69 6c 74 0a 2a 2a 20 77 69 74 68 20  s built.** with 
1350: 70 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 73 79  pre-processor sy
1360: 6d 62 6f 6c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  mbol SQLITE_MAX_
1370: 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 73  WORKER_THREADS s
1380: 65 74 20 74 6f 20 61 20 76 61 6c 75 65 20 67 72  et to a value gr
1390: 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 7a 65  eater.** than ze
13a0: 72 6f 2c 20 61 6e 64 20 28 62 29 20 77 6f 72 6b  ro, and (b) work
13b0: 65 72 20 74 68 72 65 61 64 73 20 68 61 76 65 20  er threads have 
13c0: 62 65 65 6e 20 65 6e 61 62 6c 65 64 20 61 74 20  been enabled at 
13d0: 72 75 6e 74 69 6d 65 20 62 79 20 63 61 6c 6c 69  runtime by calli
13e0: 6e 67 0a 2a 2a 20 22 50 52 41 47 4d 41 20 74 68  ng.** "PRAGMA th
13f0: 72 65 61 64 73 3d 4e 22 20 77 69 74 68 20 73 6f  reads=N" with so
1400: 6d 65 20 76 61 6c 75 65 20 6f 66 20 4e 20 67 72  me value of N gr
1410: 65 61 74 65 72 20 74 68 61 6e 20 30 2e 0a 2a 2a  eater than 0..**
1420: 0a 2a 2a 20 57 68 65 6e 20 52 65 77 69 6e 64 28  .** When Rewind(
1430: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 79  ) is called, any
1440: 20 64 61 74 61 20 72 65 6d 61 69 6e 69 6e 67 20   data remaining 
1450: 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 66 6c 75  in memory is flu
1460: 73 68 65 64 20 74 6f 20 61 20 0a 2a 2a 20 66 69  shed to a .** fi
1470: 6e 61 6c 20 50 4d 41 2e 20 53 6f 20 61 74 20 74  nal PMA. So at t
1480: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 64 61  his point the da
1490: 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ta is stored in 
14a0: 73 6f 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 73  some number of s
14b0: 6f 72 74 65 64 0a 2a 2a 20 50 4d 41 73 20 77 69  orted.** PMAs wi
14c0: 74 68 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66  thin temporary f
14d0: 69 6c 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a  iles on disk..**
14e0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
14f0: 20 66 65 77 65 72 20 74 68 61 6e 20 53 4f 52 54   fewer than SORT
1500: 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55  ER_MAX_MERGE_COU
1510: 4e 54 20 50 4d 41 73 20 69 6e 20 74 6f 74 61 6c  NT PMAs in total
1520: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 73 6f 72 74   and the.** sort
1530: 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
1540: 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
1550: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 73   mode, then thes
1560: 65 20 50 4d 41 73 20 61 72 65 20 6d 65 72 67 65  e PMAs are merge
1570: 64 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c  d.** incremental
1580: 6c 79 20 61 73 20 6b 65 79 73 20 61 72 65 20 72  ly as keys are r
1590: 65 74 72 65 69 76 65 64 20 66 72 6f 6d 20 74 68  etreived from th
15a0: 65 20 73 6f 72 74 65 72 20 62 79 20 74 68 65 20  e sorter by the 
15b0: 56 44 42 45 2e 20 20 54 68 65 0a 2a 2a 20 4d 65  VDBE.  The.** Me
15c0: 72 67 65 45 6e 67 69 6e 65 20 6f 62 6a 65 63 74  rgeEngine object
15d0: 2c 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 66  , described in f
15e0: 75 72 74 68 65 72 20 64 65 74 61 69 6c 20 62 65  urther detail be
15f0: 6c 6f 77 2c 20 70 65 72 66 6f 72 6d 73 20 74 68  low, performs th
1600: 69 73 0a 2a 2a 20 6d 65 72 67 65 2e 0a 2a 2a 0a  is.** merge..**.
1610: 2a 2a 20 4f 72 2c 20 69 66 20 72 75 6e 6e 69 6e  ** Or, if runnin
1620: 67 20 69 6e 20 6d 75 6c 74 69 2d 74 68 72 65 61  g in multi-threa
1630: 64 65 64 20 6d 6f 64 65 2c 20 74 68 65 6e 20 61  ded mode, then a
1640: 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65   background thre
1650: 61 64 20 69 73 0a 2a 2a 20 6c 61 75 6e 63 68 65  ad is.** launche
1660: 64 20 74 6f 20 6d 65 72 67 65 20 74 68 65 20 65  d to merge the e
1670: 78 69 73 74 69 6e 67 20 50 4d 41 73 2e 20 4f 6e  xisting PMAs. On
1680: 63 65 20 74 68 65 20 62 61 63 6b 67 72 6f 75 6e  ce the backgroun
1690: 64 20 74 68 72 65 61 64 20 68 61 73 0a 2a 2a 20  d thread has.** 
16a0: 6d 65 72 67 65 64 20 54 20 62 79 74 65 73 20 6f  merged T bytes o
16b0: 66 20 64 61 74 61 20 69 6e 74 6f 20 61 20 73 69  f data into a si
16c0: 6e 67 6c 65 20 73 6f 72 74 65 64 20 50 4d 41 2c  ngle sorted PMA,
16d0: 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64   the main thread
16e0: 20 0a 2a 2a 20 62 65 67 69 6e 73 20 72 65 61 64   .** begins read
16f0: 69 6e 67 20 6b 65 79 73 20 66 72 6f 6d 20 74 68  ing keys from th
1700: 61 74 20 50 4d 41 20 77 68 69 6c 65 20 74 68 65  at PMA while the
1710: 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65   background thre
1720: 61 64 20 70 72 6f 63 65 65 64 73 0a 2a 2a 20 77  ad proceeds.** w
1730: 69 74 68 20 6d 65 72 67 69 6e 67 20 74 68 65 20  ith merging the 
1740: 6e 65 78 74 20 54 20 62 79 74 65 73 20 6f 66 20  next T bytes of 
1750: 64 61 74 61 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e  data. And so on.
1760: 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
1770: 20 54 20 69 73 20 73 65 74 20 74 6f 20 68 61 6c   T is set to hal
1780: 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  f the value of t
1790: 68 65 20 6d 65 6d 6f 72 79 20 74 68 72 65 73 68  he memory thresh
17a0: 6f 6c 64 20 75 73 65 64 20 0a 2a 2a 20 62 79 20  old used .** by 
17b0: 57 72 69 74 65 28 29 20 61 62 6f 76 65 20 74 6f  Write() above to
17c0: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
17d0: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
17e0: 50 4d 41 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  PMA..**.** If th
17f0: 65 72 65 20 61 72 65 20 6d 6f 72 65 20 74 68 61  ere are more tha
1800: 6e 20 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52  n SORTER_MAX_MER
1810: 47 45 5f 43 4f 55 4e 54 20 50 4d 41 73 20 69 6e  GE_COUNT PMAs in
1820: 20 74 6f 74 61 6c 20 77 68 65 6e 20 0a 2a 2a 20   total when .** 
1830: 52 65 77 69 6e 64 28 29 20 69 73 20 63 61 6c 6c  Rewind() is call
1840: 65 64 2c 20 74 68 65 6e 20 61 20 68 69 65 72 61  ed, then a hiera
1850: 72 63 68 79 20 6f 66 20 69 6e 63 72 65 6d 65 6e  rchy of incremen
1860: 74 61 6c 2d 6d 65 72 67 65 73 20 69 73 20 75 73  tal-merges is us
1870: 65 64 2e 20 0a 2a 2a 20 46 69 72 73 74 2c 20 54  ed. .** First, T
1880: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
1890: 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 53 4f  rom the first SO
18a0: 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43  RTER_MAX_MERGE_C
18b0: 4f 55 4e 54 20 50 4d 41 73 20 6f 6e 20 0a 2a 2a  OUNT PMAs on .**
18c0: 20 64 69 73 6b 20 61 72 65 20 6d 65 72 67 65 64   disk are merged
18d0: 20 74 6f 67 65 74 68 65 72 2e 20 54 68 65 6e 20   together. Then 
18e0: 54 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  T bytes of data 
18f0: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
1900: 73 65 74 2c 20 61 6e 64 0a 2a 2a 20 73 6f 20 6f  set, and.** so o
1910: 6e 2c 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20  n, such that no 
1920: 6f 70 65 72 61 74 69 6f 6e 20 65 76 65 72 20 6d  operation ever m
1930: 65 72 67 65 73 20 6d 6f 72 65 20 74 68 61 6e 20  erges more than 
1940: 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45  SORTER_MAX_MERGE
1950: 5f 43 4f 55 4e 54 0a 2a 2a 20 50 4d 41 73 20 61  _COUNT.** PMAs a
1960: 74 20 61 20 74 69 6d 65 2e 20 54 68 69 73 20 64  t a time. This d
1970: 6f 6e 65 20 69 73 20 74 6f 20 69 6d 70 72 6f 76  one is to improv
1980: 65 20 6c 6f 63 61 6c 69 74 79 2e 0a 2a 2a 0a 2a  e locality..**.*
1990: 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  * If running in 
19a0: 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 6d  multi-threaded m
19b0: 6f 64 65 20 61 6e 64 20 74 68 65 72 65 20 61 72  ode and there ar
19c0: 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 53  e more than.** S
19d0: 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f  ORTER_MAX_MERGE_
19e0: 43 4f 55 4e 54 20 50 4d 41 73 20 6f 6e 20 64 69  COUNT PMAs on di
19f0: 73 6b 20 77 68 65 6e 20 52 65 77 69 6e 64 28 29  sk when Rewind()
1a00: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
1a10: 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e   more.** than on
1a20: 65 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72  e background thr
1a30: 65 61 64 20 6d 61 79 20 62 65 20 63 72 65 61 74  ead may be creat
1a40: 65 64 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79  ed. Specifically
1a50: 2c 20 74 68 65 72 65 20 6d 61 79 20 62 65 0a 2a  , there may be.*
1a60: 2a 20 6f 6e 65 20 62 61 63 6b 67 72 6f 75 6e 64  * one background
1a70: 20 74 68 72 65 61 64 20 66 6f 72 20 65 61 63 68   thread for each
1a80: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
1a90: 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 6f 6e 65  on disk, and one
1aa0: 20 62 61 63 6b 67 72 6f 75 6e 64 0a 2a 2a 20 74   background.** t
1ab0: 68 72 65 61 64 20 74 6f 20 6d 65 72 67 65 20 74  hread to merge t
1ac0: 68 65 20 6f 75 74 70 75 74 20 6f 66 20 65 61 63  he output of eac
1ad0: 68 20 6f 66 20 74 68 65 20 6f 74 68 65 72 73 20  h of the others 
1ae0: 74 6f 20 61 20 73 69 6e 67 6c 65 20 50 4d 41 20  to a single PMA 
1af0: 66 6f 72 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20  for.** the main 
1b00: 74 68 72 65 61 64 20 74 6f 20 72 65 61 64 20 66  thread to read f
1b10: 72 6f 6d 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  rom..*/.#include
1b20: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
1b30: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
1b40: 2e 68 22 0a 0a 2f 2a 20 0a 2a 2a 20 49 66 20 53  .h"../* .** If S
1b50: 51 4c 49 54 45 5f 44 45 42 55 47 5f 53 4f 52 54  QLITE_DEBUG_SORT
1b60: 45 52 5f 54 48 52 45 41 44 53 20 69 73 20 64 65  ER_THREADS is de
1b70: 66 69 6e 65 64 2c 20 74 68 69 73 20 6d 6f 64 75  fined, this modu
1b80: 6c 65 20 6f 75 74 70 75 74 73 20 76 61 72 69 6f  le outputs vario
1b90: 75 73 0a 2a 2a 20 6d 65 73 73 61 67 65 73 20 74  us.** messages t
1ba0: 6f 20 73 74 64 65 72 72 20 74 68 61 74 20 6d 61  o stderr that ma
1bb0: 79 20 62 65 20 68 65 6c 70 66 75 6c 20 69 6e 20  y be helpful in 
1bc0: 75 6e 64 65 72 73 74 61 6e 64 69 6e 67 20 74 68  understanding th
1bd0: 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  e performance.**
1be0: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1bf0: 20 6f 66 20 74 68 65 20 73 6f 72 74 65 72 20 69   of the sorter i
1c00: 6e 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64  n multi-threaded
1c10: 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 69 66 20 30 0a   mode..*/.#if 0.
1c20: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
1c30: 44 45 42 55 47 5f 53 4f 52 54 45 52 5f 54 48 52  DEBUG_SORTER_THR
1c40: 45 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  EADS 1.#endif../
1c50: 2a 0a 2a 2a 20 48 61 72 64 2d 63 6f 64 65 64 20  *.** Hard-coded 
1c60: 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
1c70: 66 20 64 61 74 61 20 74 6f 20 61 63 63 75 6d 75  f data to accumu
1c80: 6c 61 74 65 20 69 6e 20 6d 65 6d 6f 72 79 20 62  late in memory b
1c90: 65 66 6f 72 65 20 66 6c 75 73 68 69 6e 67 0a 2a  efore flushing.*
1ca0: 2a 20 74 6f 20 61 20 6c 65 76 65 6c 20 30 20 50  * to a level 0 P
1cb0: 4d 41 2e 20 54 68 65 20 70 75 72 70 6f 73 65 20  MA. The purpose 
1cc0: 6f 66 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73  of this limit is
1cd0: 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 72 69   to prevent vari
1ce0: 6f 75 73 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6f  ous integer.** o
1cf0: 76 65 72 66 6c 6f 77 73 2e 20 35 31 32 4d 69 42  verflows. 512MiB
1d00: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c  ..*/.#define SQL
1d10: 49 54 45 5f 4d 41 58 5f 50 4d 41 53 5a 20 20 20  ITE_MAX_PMASZ   
1d20: 20 28 31 3c 3c 32 39 29 0a 0a 2f 2a 0a 2a 2a 20   (1<<29)../*.** 
1d30: 50 72 69 76 61 74 65 20 6f 62 6a 65 63 74 73 20  Private objects 
1d40: 75 73 65 64 20 62 79 20 74 68 65 20 73 6f 72 74  used by the sort
1d50: 65 72 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  er.*/.typedef st
1d60: 72 75 63 74 20 4d 65 72 67 65 45 6e 67 69 6e 65  ruct MergeEngine
1d70: 20 4d 65 72 67 65 45 6e 67 69 6e 65 3b 20 20 20   MergeEngine;   
1d80: 20 20 2f 2a 20 4d 65 72 67 65 20 50 4d 41 73 20    /* Merge PMAs 
1d90: 74 6f 67 65 74 68 65 72 20 2a 2f 0a 74 79 70 65  together */.type
1da0: 64 65 66 20 73 74 72 75 63 74 20 50 6d 61 52 65  def struct PmaRe
1db0: 61 64 65 72 20 50 6d 61 52 65 61 64 65 72 3b 20  ader PmaReader; 
1dc0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
1dd0: 6d 65 6e 74 61 6c 6c 79 20 72 65 61 64 20 6f 6e  mentally read on
1de0: 65 20 50 4d 41 20 2a 2f 0a 74 79 70 65 64 65 66  e PMA */.typedef
1df0: 20 73 74 72 75 63 74 20 50 6d 61 57 72 69 74 65   struct PmaWrite
1e00: 72 20 50 6d 61 57 72 69 74 65 72 3b 20 20 20 20  r PmaWriter;    
1e10: 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e       /* Incremen
1e20: 74 61 6c 6c 79 20 77 72 69 74 65 20 6f 6e 65 20  tally write one 
1e30: 50 4d 41 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  PMA */.typedef s
1e40: 74 72 75 63 74 20 53 6f 72 74 65 72 52 65 63 6f  truct SorterReco
1e50: 72 64 20 53 6f 72 74 65 72 52 65 63 6f 72 64 3b  rd SorterRecord;
1e60: 20 20 20 2f 2a 20 41 20 72 65 63 6f 72 64 20 62     /* A record b
1e70: 65 69 6e 67 20 73 6f 72 74 65 64 20 2a 2f 0a 74  eing sorted */.t
1e80: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 6f  ypedef struct So
1e90: 72 74 53 75 62 74 61 73 6b 20 53 6f 72 74 53 75  rtSubtask SortSu
1ea0: 62 74 61 73 6b 3b 20 20 20 20 20 2f 2a 20 41 20  btask;     /* A 
1eb0: 73 75 62 2d 74 61 73 6b 20 69 6e 20 74 68 65 20  sub-task in the 
1ec0: 73 6f 72 74 20 70 72 6f 63 65 73 73 20 2a 2f 0a  sort process */.
1ed0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
1ee0: 6f 72 74 65 72 46 69 6c 65 20 53 6f 72 74 65 72  orterFile Sorter
1ef0: 46 69 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  File;       /* T
1f00: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 62  emporary file ob
1f10: 6a 65 63 74 20 77 72 61 70 70 65 72 20 2a 2f 0a  ject wrapper */.
1f20: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
1f30: 6f 72 74 65 72 4c 69 73 74 20 53 6f 72 74 65 72  orterList Sorter
1f40: 4c 69 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 49  List;       /* I
1f50: 6e 2d 6d 65 6d 6f 72 79 20 6c 69 73 74 20 6f 66  n-memory list of
1f60: 20 72 65 63 6f 72 64 73 20 2a 2f 0a 74 79 70 65   records */.type
1f70: 64 65 66 20 73 74 72 75 63 74 20 49 6e 63 72 4d  def struct IncrM
1f80: 65 72 67 65 72 20 49 6e 63 72 4d 65 72 67 65 72  erger IncrMerger
1f90: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20  ;       /* Read 
1fa0: 26 20 6d 65 72 67 65 20 6d 75 6c 74 69 70 6c 65  & merge multiple
1fb0: 20 50 4d 41 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20   PMAs */../*.** 
1fc0: 41 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20  A container for 
1fd0: 61 20 74 65 6d 70 20 66 69 6c 65 20 68 61 6e 64  a temp file hand
1fe0: 6c 65 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  le and the curre
1ff0: 6e 74 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61 74  nt amount of dat
2000: 61 20 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  a .** stored in 
2010: 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72  the file..*/.str
2020: 75 63 74 20 53 6f 72 74 65 72 46 69 6c 65 20 7b  uct SorterFile {
2030: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
2040: 2a 70 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  *pFd;           
2050: 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
2060: 65 20 2a 2f 0a 20 20 69 36 34 20 69 45 6f 66 3b  e */.  i64 iEof;
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2090: 6f 66 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  of data stored i
20a0: 6e 20 70 46 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  n pFd */.};../*.
20b0: 2a 2a 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ** An in-memory 
20c0: 6c 69 73 74 20 6f 66 20 6f 62 6a 65 63 74 73 20  list of objects 
20d0: 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a 2a  to be sorted..**
20e0: 0a 2a 2a 20 49 66 20 61 4d 65 6d 6f 72 79 3d 3d  .** If aMemory==
20f0: 30 20 74 68 65 6e 20 65 61 63 68 20 6f 62 6a 65  0 then each obje
2100: 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
2110: 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20 74  separately and t
2120: 68 65 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 61 72  he objects.** ar
2130: 65 20 63 6f 6e 6e 65 63 74 65 64 20 75 73 69 6e  e connected usin
2140: 67 20 53 6f 72 74 65 72 52 65 63 6f 72 64 2e 75  g SorterRecord.u
2150: 2e 70 4e 65 78 74 2e 20 20 49 66 20 61 4d 65 6d  .pNext.  If aMem
2160: 6f 72 79 21 3d 30 20 74 68 65 6e 20 61 6c 6c 20  ory!=0 then all 
2170: 6f 62 6a 65 63 74 73 0a 2a 2a 20 61 72 65 20 73  objects.** are s
2180: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 4d 65  tored in the aMe
2190: 6d 6f 72 79 5b 5d 20 62 75 6c 6b 20 6d 65 6d 6f  mory[] bulk memo
21a0: 72 79 2c 20 6f 6e 65 20 72 69 67 68 74 20 61 66  ry, one right af
21b0: 74 65 72 20 74 68 65 20 6f 74 68 65 72 2c 20 61  ter the other, a
21c0: 6e 64 0a 2a 2a 20 61 72 65 20 63 6f 6e 6e 65 63  nd.** are connec
21d0: 74 65 64 20 75 73 69 6e 67 20 53 6f 72 74 65 72  ted using Sorter
21e0: 52 65 63 6f 72 64 2e 75 2e 69 4e 65 78 74 2e 0a  Record.u.iNext..
21f0: 2a 2f 0a 73 74 72 75 63 74 20 53 6f 72 74 65 72  */.struct Sorter
2200: 4c 69 73 74 20 7b 0a 20 20 53 6f 72 74 65 72 52  List {.  SorterR
2210: 65 63 6f 72 64 20 2a 70 4c 69 73 74 3b 20 20 20  ecord *pList;   
2220: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b           /* Link
2230: 65 64 20 6c 69 73 74 20 6f 66 20 72 65 63 6f 72  ed list of recor
2240: 64 73 20 2a 2f 0a 20 20 75 38 20 2a 61 4d 65 6d  ds */.  u8 *aMem
2250: 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ory;            
2260: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
2270: 6e 2d 4e 55 4c 4c 2c 20 62 75 6c 6b 20 6d 65 6d  n-NULL, bulk mem
2280: 6f 72 79 20 74 6f 20 68 6f 6c 64 20 70 4c 69 73  ory to hold pLis
2290: 74 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 50 4d 41  t */.  int szPMA
22a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22b0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
22c0: 66 20 70 4c 69 73 74 20 61 73 20 50 4d 41 20 69  f pList as PMA i
22d0: 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  n bytes */.};../
22e0: 2a 0a 2a 2a 20 54 68 65 20 4d 65 72 67 65 45 6e  *.** The MergeEn
22f0: 67 69 6e 65 20 6f 62 6a 65 63 74 20 69 73 20 75  gine object is u
2300: 73 65 64 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  sed to combine t
2310: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 6d 61 6c 6c  wo or more small
2320: 65 72 20 50 4d 41 73 20 69 6e 74 6f 0a 2a 2a 20  er PMAs into.** 
2330: 6f 6e 65 20 62 69 67 20 50 4d 41 20 75 73 69 6e  one big PMA usin
2340: 67 20 61 20 6d 65 72 67 65 20 6f 70 65 72 61 74  g a merge operat
2350: 69 6f 6e 2e 20 20 53 65 70 61 72 61 74 65 20 50  ion.  Separate P
2360: 4d 41 73 20 61 6c 6c 20 6e 65 65 64 20 74 6f 20  MAs all need to 
2370: 62 65 0a 2a 2a 20 63 6f 6d 62 69 6e 65 64 20 69  be.** combined i
2380: 6e 74 6f 20 6f 6e 65 20 62 69 67 20 50 4d 41 20  nto one big PMA 
2390: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 61  in order to be a
23a0: 62 6c 65 20 74 6f 20 73 74 65 70 20 74 68 72 6f  ble to step thro
23b0: 75 67 68 20 74 68 65 20 73 6f 72 74 65 64 0a 2a  ugh the sorted.*
23c0: 2a 20 72 65 63 6f 72 64 73 20 69 6e 20 6f 72 64  * records in ord
23d0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 52  er..**.** The aR
23e0: 65 61 64 72 5b 5d 20 61 72 72 61 79 20 63 6f 6e  eadr[] array con
23f0: 74 61 69 6e 73 20 61 20 50 6d 61 52 65 61 64 65  tains a PmaReade
2400: 72 20 6f 62 6a 65 63 74 20 66 6f 72 20 65 61 63  r object for eac
2410: 68 20 6f 66 20 74 68 65 20 50 4d 41 73 20 62 65  h of the PMAs be
2420: 69 6e 67 0a 2a 2a 20 6d 65 72 67 65 64 2e 20 20  ing.** merged.  
2430: 41 6e 20 61 52 65 61 64 72 5b 5d 20 6f 62 6a 65  An aReadr[] obje
2440: 63 74 20 65 69 74 68 65 72 20 70 6f 69 6e 74 73  ct either points
2450: 20 74 6f 20 61 20 76 61 6c 69 64 20 6b 65 79 20   to a valid key 
2460: 6f 72 20 65 6c 73 65 20 69 73 20 61 74 20 45 4f  or else is at EO
2470: 46 2e 0a 2a 2a 20 28 22 45 4f 46 22 20 6d 65 61  F..** ("EOF" mea
2480: 6e 73 20 22 45 6e 64 20 4f 66 20 46 69 6c 65 22  ns "End Of File"
2490: 2e 20 20 57 68 65 6e 20 61 52 65 61 64 72 5b 5d  .  When aReadr[]
24a0: 20 69 73 20 61 74 20 45 4f 46 20 74 68 65 72 65   is at EOF there
24b0: 20 69 73 20 6e 6f 20 6d 6f 72 65 20 64 61 74 61   is no more data
24c0: 2e 29 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  .).** For the pu
24d0: 72 70 6f 73 65 73 20 6f 66 20 74 68 65 20 70 61  rposes of the pa
24e0: 72 61 67 72 61 70 68 73 20 62 65 6c 6f 77 2c 20  ragraphs below, 
24f0: 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  we assume that t
2500: 68 65 20 61 72 72 61 79 20 69 73 0a 2a 2a 20 61  he array is.** a
2510: 63 74 75 61 6c 6c 79 20 4e 20 65 6c 65 6d 65 6e  ctually N elemen
2520: 74 73 20 69 6e 20 73 69 7a 65 2c 20 77 68 65 72  ts in size, wher
2530: 65 20 4e 20 69 73 20 74 68 65 20 73 6d 61 6c 6c  e N is the small
2540: 65 73 74 20 70 6f 77 65 72 20 6f 66 20 32 20 67  est power of 2 g
2550: 72 65 61 74 65 72 0a 2a 2a 20 74 6f 20 6f 72 20  reater.** to or 
2560: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d  equal to the num
2570: 62 65 72 20 6f 66 20 50 4d 41 73 20 62 65 69 6e  ber of PMAs bein
2580: 67 20 6d 65 72 67 65 64 2e 20 54 68 65 20 65 78  g merged. The ex
2590: 74 72 61 20 61 52 65 61 64 72 5b 5d 20 65 6c 65  tra aReadr[] ele
25a0: 6d 65 6e 74 73 0a 2a 2a 20 61 72 65 20 74 72 65  ments.** are tre
25b0: 61 74 65 64 20 61 73 20 69 66 20 74 68 65 79 20  ated as if they 
25c0: 61 72 65 20 65 6d 70 74 79 20 28 61 6c 77 61 79  are empty (alway
25d0: 73 20 61 74 20 45 4f 46 29 2e 0a 2a 2a 0a 2a 2a  s at EOF)..**.**
25e0: 20 54 68 65 20 61 54 72 65 65 5b 5d 20 61 72 72   The aTree[] arr
25f0: 61 79 20 69 73 20 61 6c 73 6f 20 4e 20 65 6c 65  ay is also N ele
2600: 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 20 54  ments in size. T
2610: 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 20 69 73  he value of N is
2620: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68   stored in.** th
2630: 65 20 4d 65 72 67 65 45 6e 67 69 6e 65 2e 6e 54  e MergeEngine.nT
2640: 72 65 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2a  ree variable..**
2650: 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 28 4e  .** The final (N
2660: 2f 32 29 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  /2) elements of 
2670: 61 54 72 65 65 5b 5d 20 63 6f 6e 74 61 69 6e 20  aTree[] contain 
2680: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63  the results of c
2690: 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 70 61 69 72  omparing.** pair
26a0: 73 20 6f 66 20 50 4d 41 20 6b 65 79 73 20 74 6f  s of PMA keys to
26b0: 67 65 74 68 65 72 2e 20 45 6c 65 6d 65 6e 74 20  gether. Element 
26c0: 69 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  i contains the r
26d0: 65 73 75 6c 74 20 6f 66 20 0a 2a 2a 20 63 6f 6d  esult of .** com
26e0: 70 61 72 69 6e 67 20 61 52 65 61 64 72 5b 32 2a  paring aReadr[2*
26f0: 69 2d 4e 5d 20 61 6e 64 20 61 52 65 61 64 72 5b  i-N] and aReadr[
2700: 32 2a 69 2d 4e 2b 31 5d 2e 20 57 68 69 63 68 65  2*i-N+1]. Whiche
2710: 76 65 72 20 6b 65 79 20 69 73 20 73 6d 61 6c 6c  ver key is small
2720: 65 72 2c 20 74 68 65 0a 2a 2a 20 61 54 72 65 65  er, the.** aTree
2730: 20 65 6c 65 6d 65 6e 74 20 69 73 20 73 65 74 20   element is set 
2740: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
2750: 69 74 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  it. .**.** For t
2760: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
2770: 68 69 73 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  his comparison, 
2780: 45 4f 46 20 69 73 20 63 6f 6e 73 69 64 65 72 65  EOF is considere
2790: 64 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  d greater than a
27a0: 6e 79 0a 2a 2a 20 6f 74 68 65 72 20 6b 65 79 20  ny.** other key 
27b0: 76 61 6c 75 65 2e 20 49 66 20 74 68 65 20 6b 65  value. If the ke
27c0: 79 73 20 61 72 65 20 65 71 75 61 6c 20 28 6f 6e  ys are equal (on
27d0: 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  ly possible with
27e0: 20 74 77 6f 20 45 4f 46 0a 2a 2a 20 76 61 6c 75   two EOF.** valu
27f0: 65 73 29 2c 20 69 74 20 64 6f 65 73 6e 27 74 20  es), it doesn't 
2800: 6d 61 74 74 65 72 20 77 68 69 63 68 20 69 6e 64  matter which ind
2810: 65 78 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2a  ex is stored..**
2820: 0a 2a 2a 20 54 68 65 20 28 4e 2f 34 29 20 65 6c  .** The (N/4) el
2830: 65 6d 65 6e 74 73 20 6f 66 20 61 54 72 65 65 5b  ements of aTree[
2840: 5d 20 74 68 61 74 20 70 72 65 63 65 64 65 20 74  ] that precede t
2850: 68 65 20 66 69 6e 61 6c 20 28 4e 2f 32 29 20 64  he final (N/2) d
2860: 65 73 63 72 69 62 65 64 20 0a 2a 2a 20 61 62 6f  escribed .** abo
2870: 76 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ve contains the 
2880: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 73 6d 61  index of the sma
2890: 6c 6c 65 73 74 20 6f 66 20 65 61 63 68 20 62 6c  llest of each bl
28a0: 6f 63 6b 20 6f 66 20 34 20 50 6d 61 52 65 61 64  ock of 4 PmaRead
28b0: 65 72 73 0a 2a 2a 20 41 6e 64 20 73 6f 20 6f 6e  ers.** And so on
28c0: 2e 20 53 6f 20 74 68 61 74 20 61 54 72 65 65 5b  . So that aTree[
28d0: 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  1] contains the 
28e0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 50 6d 61  index of the Pma
28f0: 52 65 61 64 65 72 20 74 68 61 74 20 0a 2a 2a 20  Reader that .** 
2900: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
2910: 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   to the smallest
2920: 20 6b 65 79 20 76 61 6c 75 65 2e 20 61 54 72 65   key value. aTre
2930: 65 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 2e 0a  e[0] is unused..
2940: 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 2a  **.** Example:.*
2950: 2a 0a 2a 2a 20 20 20 20 20 61 52 65 61 64 72 5b  *.**     aReadr[
2960: 30 5d 20 2d 3e 20 42 61 6e 61 6e 61 0a 2a 2a 20  0] -> Banana.** 
2970: 20 20 20 20 61 52 65 61 64 72 5b 31 5d 20 2d 3e      aReadr[1] ->
2980: 20 46 65 69 6a 6f 61 0a 2a 2a 20 20 20 20 20 61   Feijoa.**     a
2990: 52 65 61 64 72 5b 32 5d 20 2d 3e 20 45 6c 64 65  Readr[2] -> Elde
29a0: 72 62 65 72 72 79 0a 2a 2a 20 20 20 20 20 61 52  rberry.**     aR
29b0: 65 61 64 72 5b 33 5d 20 2d 3e 20 43 75 72 72 61  eadr[3] -> Curra
29c0: 6e 74 0a 2a 2a 20 20 20 20 20 61 52 65 61 64 72  nt.**     aReadr
29d0: 5b 34 5d 20 2d 3e 20 47 72 61 70 65 66 72 75 69  [4] -> Grapefrui
29e0: 74 0a 2a 2a 20 20 20 20 20 61 52 65 61 64 72 5b  t.**     aReadr[
29f0: 35 5d 20 2d 3e 20 41 70 70 6c 65 0a 2a 2a 20 20  5] -> Apple.**  
2a00: 20 20 20 61 52 65 61 64 72 5b 36 5d 20 2d 3e 20     aReadr[6] -> 
2a10: 44 75 72 69 61 6e 0a 2a 2a 20 20 20 20 20 61 52  Durian.**     aR
2a20: 65 61 64 72 5b 37 5d 20 2d 3e 20 45 4f 46 0a 2a  eadr[7] -> EOF.*
2a30: 2a 0a 2a 2a 20 20 20 20 20 61 54 72 65 65 5b 5d  *.**     aTree[]
2a40: 20 3d 20 7b 20 58 2c 20 35 20 20 20 30 2c 20 35   = { X, 5   0, 5
2a50: 20 20 20 20 30 2c 20 33 2c 20 35 2c 20 36 20 7d      0, 3, 5, 6 }
2a60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65  .**.** The curre
2a70: 6e 74 20 65 6c 65 6d 65 6e 74 20 69 73 20 22 41  nt element is "A
2a80: 70 70 6c 65 22 20 28 74 68 65 20 76 61 6c 75 65  pple" (the value
2a90: 20 6f 66 20 74 68 65 20 6b 65 79 20 69 6e 64 69   of the key indi
2aa0: 63 61 74 65 64 20 62 79 20 0a 2a 2a 20 50 6d 61  cated by .** Pma
2ab0: 52 65 61 64 65 72 20 35 29 2e 20 57 68 65 6e 20  Reader 5). When 
2ac0: 74 68 65 20 4e 65 78 74 28 29 20 6f 70 65 72 61  the Next() opera
2ad0: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2c  tion is invoked,
2ae0: 20 50 6d 61 52 65 61 64 65 72 20 35 20 77 69 6c   PmaReader 5 wil
2af0: 6c 0a 2a 2a 20 62 65 20 61 64 76 61 6e 63 65 64  l.** be advanced
2b00: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6b 65 79   to the next key
2b10: 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74 2e   in its segment.
2b20: 20 53 61 79 20 74 68 65 20 6e 65 78 74 20 6b 65   Say the next ke
2b30: 79 20 69 73 0a 2a 2a 20 22 45 67 67 70 6c 61 6e  y is.** "Eggplan
2b40: 74 22 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 52  t":.**.**     aR
2b50: 65 61 64 72 5b 35 5d 20 2d 3e 20 45 67 67 70 6c  eadr[5] -> Eggpl
2b60: 61 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ant.**.** The co
2b70: 6e 74 65 6e 74 73 20 6f 66 20 61 54 72 65 65 5b  ntents of aTree[
2b80: 5d 20 61 72 65 20 75 70 64 61 74 65 64 20 66 69  ] are updated fi
2b90: 72 73 74 20 62 79 20 63 6f 6d 70 61 72 69 6e 67  rst by comparing
2ba0: 20 74 68 65 20 6e 65 77 20 50 6d 61 52 65 61 64   the new PmaRead
2bb0: 65 72 0a 2a 2a 20 35 20 6b 65 79 20 74 6f 20 74  er.** 5 key to t
2bc0: 68 65 20 63 75 72 72 65 6e 74 20 6b 65 79 20 6f  he current key o
2bd0: 66 20 50 6d 61 52 65 61 64 65 72 20 34 20 28 73  f PmaReader 4 (s
2be0: 74 69 6c 6c 20 22 47 72 61 70 65 66 72 75 69 74  till "Grapefruit
2bf0: 22 29 2e 20 54 68 65 20 50 6d 61 52 65 61 64 65  "). The PmaReade
2c00: 72 0a 2a 2a 20 35 20 76 61 6c 75 65 20 69 73 20  r.** 5 value is 
2c10: 73 74 69 6c 6c 20 73 6d 61 6c 6c 65 72 2c 20 73  still smaller, s
2c20: 6f 20 61 54 72 65 65 5b 36 5d 20 69 73 20 73 65  o aTree[6] is se
2c30: 74 20 74 6f 20 35 2e 20 41 6e 64 20 73 6f 20 6f  t to 5. And so o
2c40: 6e 20 75 70 20 74 68 65 20 74 72 65 65 2e 0a 2a  n up the tree..*
2c50: 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 50  * The value of P
2c60: 6d 61 52 65 61 64 65 72 20 36 20 2d 20 22 44 75  maReader 6 - "Du
2c70: 72 69 61 6e 22 20 2d 20 69 73 20 6e 6f 77 20 73  rian" - is now s
2c80: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 61 74  maller than that
2c90: 20 6f 66 20 50 6d 61 52 65 61 64 65 72 0a 2a 2a   of PmaReader.**
2ca0: 20 35 2c 20 73 6f 20 61 54 72 65 65 5b 33 5d 20   5, so aTree[3] 
2cb0: 69 73 20 73 65 74 20 74 6f 20 36 2e 20 4b 65 79  is set to 6. Key
2cc0: 20 30 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68   0 is smaller th
2cd0: 61 6e 20 6b 65 79 20 36 20 28 42 61 6e 61 6e 61  an key 6 (Banana
2ce0: 3c 44 75 72 69 61 6e 29 2c 0a 2a 2a 20 73 6f 20  <Durian),.** so 
2cf0: 74 68 65 20 76 61 6c 75 65 20 77 72 69 74 74 65  the value writte
2d00: 6e 20 69 6e 74 6f 20 65 6c 65 6d 65 6e 74 20 31  n into element 1
2d10: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73   of the array is
2d20: 20 30 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a   0. As follows:.
2d30: 2a 2a 0a 2a 2a 20 20 20 20 20 61 54 72 65 65 5b  **.**     aTree[
2d40: 5d 20 3d 20 7b 20 58 2c 20 30 20 20 20 30 2c 20  ] = { X, 0   0, 
2d50: 36 20 20 20 20 30 2c 20 33 2c 20 35 2c 20 36 20  6    0, 3, 5, 6 
2d60: 7d 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  }.**.** In other
2d70: 20 77 6f 72 64 73 2c 20 65 61 63 68 20 74 69 6d   words, each tim
2d80: 65 20 77 65 20 61 64 76 61 6e 63 65 20 74 6f 20  e we advance to 
2d90: 74 68 65 20 6e 65 78 74 20 73 6f 72 74 65 72 20  the next sorter 
2da0: 65 6c 65 6d 65 6e 74 2c 20 6c 6f 67 32 28 4e 29  element, log2(N)
2db0: 0a 2a 2a 20 6b 65 79 20 63 6f 6d 70 61 72 69 73  .** key comparis
2dc0: 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  on operations ar
2dd0: 65 20 72 65 71 75 69 72 65 64 2c 20 77 68 65 72  e required, wher
2de0: 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
2df0: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 0a 2a 2a  r of segments.**
2e00: 20 62 65 69 6e 67 20 6d 65 72 67 65 64 20 28 72   being merged (r
2e10: 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65  ounded up to the
2e20: 20 6e 65 78 74 20 70 6f 77 65 72 20 6f 66 20 32   next power of 2
2e30: 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4d 65 72  )..*/.struct Mer
2e40: 67 65 45 6e 67 69 6e 65 20 7b 0a 20 20 69 6e 74  geEngine {.  int
2e50: 20 6e 54 72 65 65 3b 20 20 20 20 20 20 20 20 20   nTree;         
2e60: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2e70: 73 69 7a 65 20 6f 66 20 61 54 72 65 65 2f 61 52  size of aTree/aR
2e80: 65 61 64 72 20 28 70 6f 77 65 72 20 6f 66 20 32  eadr (power of 2
2e90: 29 20 2a 2f 0a 20 20 53 6f 72 74 53 75 62 74 61  ) */.  SortSubta
2ea0: 73 6b 20 2a 70 54 61 73 6b 3b 20 20 20 20 20 20  sk *pTask;      
2eb0: 20 20 2f 2a 20 55 73 65 64 20 62 79 20 74 68 69    /* Used by thi
2ec0: 73 20 74 68 72 65 61 64 20 6f 6e 6c 79 20 2a 2f  s thread only */
2ed0: 0a 20 20 69 6e 74 20 2a 61 54 72 65 65 3b 20 20  .  int *aTree;  
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ef0: 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   Current state o
2f00: 66 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  f incremental me
2f10: 72 67 65 20 2a 2f 0a 20 20 50 6d 61 52 65 61 64  rge */.  PmaRead
2f20: 65 72 20 2a 61 52 65 61 64 72 3b 20 20 20 20 20  er *aReadr;     
2f30: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2f40: 50 6d 61 52 65 61 64 65 72 73 20 74 6f 20 6d 65  PmaReaders to me
2f50: 72 67 65 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f  rge data from */
2f60: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .};../*.** This 
2f70: 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
2f80: 73 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61  s a single threa
2f90: 64 20 6f 66 20 63 6f 6e 74 72 6f 6c 20 69 6e 20  d of control in 
2fa0: 61 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e  a sort operation
2fb0: 2e 0a 2a 2a 20 45 78 61 63 74 6c 79 20 56 64 62  ..** Exactly Vdb
2fc0: 65 53 6f 72 74 65 72 2e 6e 54 61 73 6b 20 69 6e  eSorter.nTask in
2fd0: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20  stances of this 
2fe0: 6f 62 6a 65 63 74 20 61 72 65 20 61 6c 6c 6f 63  object are alloc
2ff0: 61 74 65 64 0a 2a 2a 20 61 73 20 70 61 72 74 20  ated.** as part 
3000: 6f 66 20 65 61 63 68 20 56 64 62 65 53 6f 72 74  of each VdbeSort
3010: 65 72 20 6f 62 6a 65 63 74 2e 20 49 6e 73 74 61  er object. Insta
3020: 6e 63 65 73 20 61 72 65 20 6e 65 76 65 72 20 61  nces are never a
3030: 6c 6c 6f 63 61 74 65 64 20 61 6e 79 0a 2a 2a 20  llocated any.** 
3040: 6f 74 68 65 72 20 77 61 79 2e 20 56 64 62 65 53  other way. VdbeS
3050: 6f 72 74 65 72 2e 6e 54 61 73 6b 20 69 73 20 73  orter.nTask is s
3060: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
3070: 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61   of worker threa
3080: 64 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 28 73  ds allowed.** (s
3090: 65 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ee SQLITE_CONFIG
30a0: 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 29  _WORKER_THREADS)
30b0: 20 70 6c 75 73 20 6f 6e 65 20 28 74 68 65 20 6d   plus one (the m
30c0: 61 69 6e 20 74 68 72 65 61 64 29 2e 20 20 54 68  ain thread).  Th
30d0: 75 73 20 66 6f 72 0a 2a 2a 20 73 69 6e 67 6c 65  us for.** single
30e0: 2d 74 68 72 65 61 64 65 64 20 6f 70 65 72 61 74  -threaded operat
30f0: 69 6f 6e 2c 20 74 68 65 72 65 20 69 73 20 65 78  ion, there is ex
3100: 61 63 74 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e  actly one instan
3110: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
3120: 74 0a 2a 2a 20 61 6e 64 20 66 6f 72 20 6d 75 6c  t.** and for mul
3130: 74 69 2d 74 68 72 65 61 64 65 64 20 6f 70 65 72  ti-threaded oper
3140: 61 74 69 6f 6e 20 74 68 65 72 65 20 61 72 65 20  ation there are 
3150: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 73 74  two or more inst
3160: 61 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 73 73  ances..**.** Ess
3170: 65 6e 74 69 61 6c 6c 79 2c 20 74 68 69 73 20 73  entially, this s
3180: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
3190: 73 20 61 6c 6c 20 74 68 6f 73 65 20 66 69 65 6c  s all those fiel
31a0: 64 73 20 6f 66 20 74 68 65 20 56 64 62 65 53 6f  ds of the VdbeSo
31b0: 72 74 65 72 0a 2a 2a 20 73 74 72 75 63 74 75 72  rter.** structur
31c0: 65 20 66 6f 72 20 77 68 69 63 68 20 65 61 63 68  e for which each
31d0: 20 74 68 72 65 61 64 20 72 65 71 75 69 72 65 73   thread requires
31e0: 20 61 20 73 65 70 61 72 61 74 65 20 69 6e 73 74   a separate inst
31f0: 61 6e 63 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ance. For exampl
3200: 65 2c 0a 2a 2a 20 65 61 63 68 20 74 68 72 65 61  e,.** each threa
3210: 64 20 72 65 71 75 72 69 65 73 20 69 74 73 20 6f  d requries its o
3220: 77 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  wn UnpackedRecor
3230: 64 20 6f 62 6a 65 63 74 20 74 6f 20 75 6e 70 61  d object to unpa
3240: 63 6b 20 72 65 63 6f 72 64 73 20 69 6e 0a 2a 2a  ck records in.**
3250: 20 61 73 20 70 61 72 74 20 6f 66 20 63 6f 6d 70   as part of comp
3260: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
3270: 73 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  s..**.** Before 
3280: 61 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72  a background thr
3290: 65 61 64 20 69 73 20 6c 61 75 6e 63 68 65 64 2c  ead is launched,
32a0: 20 76 61 72 69 61 62 6c 65 20 62 44 6f 6e 65 20   variable bDone 
32b0: 69 73 20 73 65 74 20 74 6f 20 30 2e 20 54 68 65  is set to 0. The
32c0: 6e 2c 20 0a 2a 2a 20 72 69 67 68 74 20 62 65 66  n, .** right bef
32d0: 6f 72 65 20 69 74 20 65 78 69 74 73 2c 20 74 68  ore it exits, th
32e0: 65 20 74 68 72 65 61 64 20 69 74 73 65 6c 66 20  e thread itself 
32f0: 73 65 74 73 20 62 44 6f 6e 65 20 74 6f 20 31 2e  sets bDone to 1.
3300: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
3310: 72 20 0a 2a 2a 20 74 77 6f 20 70 75 72 70 6f 73  r .** two purpos
3320: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 57  es:.**.**   1. W
3330: 68 65 6e 20 66 6c 75 73 68 69 6e 67 20 74 68 65  hen flushing the
3340: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 65 6d   contents of mem
3350: 6f 72 79 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30  ory to a level-0
3360: 20 50 4d 41 20 6f 6e 20 64 69 73 6b 2c 20 74 6f   PMA on disk, to
3370: 0a 2a 2a 20 20 20 20 20 20 61 74 74 65 6d 70 74  .**      attempt
3380: 20 74 6f 20 73 65 6c 65 63 74 20 61 20 53 6f 72   to select a Sor
3390: 74 53 75 62 74 61 73 6b 20 66 6f 72 20 77 68 69  tSubtask for whi
33a0: 63 68 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  ch there is not 
33b0: 61 6c 72 65 61 64 79 20 61 6e 0a 2a 2a 20 20 20  already an.**   
33c0: 20 20 20 61 63 74 69 76 65 20 62 61 63 6b 67 72     active backgr
33d0: 6f 75 6e 64 20 74 68 72 65 61 64 20 28 73 69 6e  ound thread (sin
33e0: 63 65 20 64 6f 69 6e 67 20 73 6f 20 63 61 75 73  ce doing so caus
33f0: 65 73 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65  es the main thre
3400: 61 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 62 6c  ad.**      to bl
3410: 6f 63 6b 20 75 6e 74 69 6c 20 69 74 20 66 69 6e  ock until it fin
3420: 69 73 68 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  ishes)..**.**   
3430: 32 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  2. If SQLITE_DEB
3440: 55 47 5f 53 4f 52 54 45 52 5f 54 48 52 45 41 44  UG_SORTER_THREAD
3450: 53 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 6f  S is defined, to
3460: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20   determine if a 
3470: 63 61 6c 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  call.**      to 
3480: 73 71 6c 69 74 65 33 54 68 72 65 61 64 4a 6f 69  sqlite3ThreadJoi
3490: 6e 28 29 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f  n() is likely to
34a0: 20 62 6c 6f 63 6b 2e 20 43 61 73 65 73 20 74 68   block. Cases th
34b0: 61 74 20 61 72 65 20 6c 69 6b 65 6c 79 20 74 6f  at are likely to
34c0: 0a 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 20 70  .**      block p
34d0: 72 6f 76 6f 6b 65 20 64 65 62 75 67 67 69 6e 67  rovoke debugging
34e0: 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 49   output..**.** I
34f0: 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68  n both cases, th
3500: 65 20 65 66 66 65 63 74 73 20 6f 66 20 74 68 65  e effects of the
3510: 20 6d 61 69 6e 20 74 68 72 65 61 64 20 73 65 65   main thread see
3520: 69 6e 67 20 28 62 44 6f 6e 65 3d 3d 30 29 20 65  ing (bDone==0) e
3530: 76 65 6e 0a 2a 2a 20 61 66 74 65 72 20 74 68 65  ven.** after the
3540: 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e 69   thread has fini
3550: 73 68 65 64 20 61 72 65 20 6e 6f 74 20 64 69 72  shed are not dir
3560: 65 2e 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 77  e. So we don't w
3570: 6f 72 72 79 20 61 62 6f 75 74 0a 2a 2a 20 6d 65  orry about.** me
3580: 6d 6f 72 79 20 62 61 72 72 69 65 72 73 20 61 6e  mory barriers an
3590: 64 20 73 75 63 68 20 68 65 72 65 2e 0a 2a 2f 0a  d such here..*/.
35a0: 74 79 70 65 64 65 66 20 69 6e 74 20 28 2a 53 6f  typedef int (*So
35b0: 72 74 65 72 43 6f 6d 70 61 72 65 29 28 53 6f 72  rterCompare)(Sor
35c0: 74 53 75 62 74 61 73 6b 2a 2c 69 6e 74 2a 2c 63  tSubtask*,int*,c
35d0: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
35e0: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 29 3b  onst void*,int);
35f0: 0a 73 74 72 75 63 74 20 53 6f 72 74 53 75 62 74  .struct SortSubt
3600: 61 73 6b 20 7b 0a 20 20 53 51 4c 69 74 65 54 68  ask {.  SQLiteTh
3610: 72 65 61 64 20 2a 70 54 68 72 65 61 64 3b 20 20  read *pThread;  
3620: 20 20 20 20 20 20 20 20 2f 2a 20 42 61 63 6b 67          /* Backg
3630: 72 6f 75 6e 64 20 74 68 72 65 61 64 2c 20 69 66  round thread, if
3640: 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 62 44   any */.  int bD
3650: 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  one;            
3660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
3670: 20 69 66 20 74 68 72 65 61 64 20 69 73 20 66 69   if thread is fi
3680: 6e 69 73 68 65 64 20 62 75 74 20 6e 6f 74 20 6a  nished but not j
3690: 6f 69 6e 65 64 20 2a 2f 0a 20 20 56 64 62 65 53  oined */.  VdbeS
36a0: 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72 3b 20  orter *pSorter; 
36b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
36c0: 72 74 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74  rter that owns t
36d0: 68 69 73 20 73 75 62 2d 74 61 73 6b 20 2a 2f 0a  his sub-task */.
36e0: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
36f0: 20 2a 70 55 6e 70 61 63 6b 65 64 3b 20 20 20 20   *pUnpacked;    
3700: 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 75 6e    /* Space to un
3710: 70 61 63 6b 20 61 20 72 65 63 6f 72 64 20 2a 2f  pack a record */
3720: 0a 20 20 53 6f 72 74 65 72 4c 69 73 74 20 6c 69  .  SorterList li
3730: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
3740: 20 20 20 2f 2a 20 4c 69 73 74 20 66 6f 72 20 74     /* List for t
3750: 68 72 65 61 64 20 74 6f 20 77 72 69 74 65 20 74  hread to write t
3760: 6f 20 61 20 50 4d 41 20 2a 2f 0a 20 20 69 6e 74  o a PMA */.  int
3770: 20 6e 50 4d 41 3b 20 20 20 20 20 20 20 20 20 20   nPMA;          
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3790: 4e 75 6d 62 65 72 20 6f 66 20 50 4d 41 73 20 63  Number of PMAs c
37a0: 75 72 72 65 6e 74 6c 79 20 69 6e 20 66 69 6c 65  urrently in file
37b0: 20 2a 2f 0a 20 20 53 6f 72 74 65 72 43 6f 6d 70   */.  SorterComp
37c0: 61 72 65 20 78 43 6f 6d 70 61 72 65 3b 20 20 20  are xCompare;   
37d0: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
37e0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 75 73 65   function to use
37f0: 20 2a 2f 0a 20 20 53 6f 72 74 65 72 46 69 6c 65   */.  SorterFile
3800: 20 66 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20   file;          
3810: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 66 69        /* Temp fi
3820: 6c 65 20 66 6f 72 20 6c 65 76 65 6c 2d 30 20 50  le for level-0 P
3830: 4d 41 73 20 2a 2f 0a 20 20 53 6f 72 74 65 72 46  MAs */.  SorterF
3840: 69 6c 65 20 66 69 6c 65 32 3b 20 20 20 20 20 20  ile file2;      
3850: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
3860: 65 20 66 6f 72 20 6f 74 68 65 72 20 50 4d 41 73  e for other PMAs
3870: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 4d   */.};.../*.** M
3880: 61 69 6e 20 73 6f 72 74 65 72 20 73 74 72 75 63  ain sorter struc
3890: 74 75 72 65 2e 20 41 20 73 69 6e 67 6c 65 20 69  ture. A single i
38a0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
38b0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
38c0: 20 65 61 63 68 20 0a 2a 2a 20 73 6f 72 74 65 72   each .** sorter
38d0: 20 63 75 72 73 6f 72 20 63 72 65 61 74 65 64 20   cursor created 
38e0: 62 79 20 74 68 65 20 56 44 42 45 2e 0a 2a 2a 0a  by the VDBE..**.
38f0: 2a 2a 20 6d 78 4b 65 79 73 69 7a 65 3a 0a 2a 2a  ** mxKeysize:.**
3900: 20 20 20 41 73 20 72 65 63 6f 72 64 73 20 61 72     As records ar
3910: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73  e added to the s
3920: 6f 72 74 65 72 20 62 79 20 63 61 6c 6c 73 20 74  orter by calls t
3930: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72  o sqlite3VdbeSor
3940: 74 65 72 57 72 69 74 65 28 29 2c 0a 2a 2a 20 20  terWrite(),.**  
3950: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
3960: 73 20 75 70 64 61 74 65 64 20 73 6f 20 61 73 20  s updated so as 
3970: 74 6f 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  to be set to the
3980: 20 73 69 7a 65 20 6f 6e 20 64 69 73 6b 20 6f 66   size on disk of
3990: 20 74 68 65 0a 2a 2a 20 20 20 6c 61 72 67 65 73   the.**   larges
39a0: 74 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  t record in the 
39b0: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 72 75 63  sorter..*/.struc
39c0: 74 20 56 64 62 65 53 6f 72 74 65 72 20 7b 0a 20  t VdbeSorter {. 
39d0: 20 69 6e 74 20 6d 6e 50 6d 61 53 69 7a 65 3b 20   int mnPmaSize; 
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39f0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 50 4d 41 20   /* Minimum PMA 
3a00: 73 69 7a 65 2c 20 69 6e 20 62 79 74 65 73 20 2a  size, in bytes *
3a10: 2f 0a 20 20 69 6e 74 20 6d 78 50 6d 61 53 69 7a  /.  int mxPmaSiz
3a20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3a30: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 50      /* Maximum P
3a40: 4d 41 20 73 69 7a 65 2c 20 69 6e 20 62 79 74 65  MA size, in byte
3a50: 73 2e 20 20 30 3d 3d 6e 6f 20 6c 69 6d 69 74 20  s.  0==no limit 
3a60: 2a 2f 0a 20 20 69 6e 74 20 6d 78 4b 65 79 73 69  */.  int mxKeysi
3a70: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
3a80: 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20       /* Largest 
3a90: 73 65 72 69 61 6c 69 7a 65 64 20 6b 65 79 20 73  serialized key s
3aa0: 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  een so far */.  
3ab0: 69 6e 74 20 70 67 73 7a 3b 20 20 20 20 20 20 20  int pgsz;       
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ad0: 2f 2a 20 4d 61 69 6e 20 64 61 74 61 62 61 73 65  /* Main database
3ae0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
3af0: 50 6d 61 52 65 61 64 65 72 20 2a 70 52 65 61 64  PmaReader *pRead
3b00: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
3b10: 2f 2a 20 52 65 61 64 72 20 64 61 74 61 20 66 72  /* Readr data fr
3b20: 6f 6d 20 68 65 72 65 20 61 66 74 65 72 20 52 65  om here after Re
3b30: 77 69 6e 64 28 29 20 2a 2f 0a 20 20 4d 65 72 67  wind() */.  Merg
3b40: 65 45 6e 67 69 6e 65 20 2a 70 4d 65 72 67 65 72  eEngine *pMerger
3b50: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;           /* O
3b60: 72 20 68 65 72 65 2c 20 69 66 20 62 55 73 65 54  r here, if bUseT
3b70: 68 72 65 61 64 73 3d 3d 30 20 2a 2f 0a 20 20 73  hreads==0 */.  s
3b80: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3ba0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
3bb0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 4b 65 79 49 6e  ction */.  KeyIn
3bc0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20  fo *pKeyInfo;   
3bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
3be0: 77 20 74 6f 20 63 6f 6d 70 61 72 65 20 72 65 63  w to compare rec
3bf0: 6f 72 64 73 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  ords */.  Unpack
3c00: 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63  edRecord *pUnpac
3c10: 6b 65 64 3b 20 20 20 20 20 20 2f 2a 20 55 73 65  ked;      /* Use
3c20: 64 20 62 79 20 56 64 62 65 53 6f 72 74 65 72 43  d by VdbeSorterC
3c30: 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 53 6f  ompare() */.  So
3c40: 72 74 65 72 4c 69 73 74 20 6c 69 73 74 3b 20 20  rterList list;  
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c60: 20 4c 69 73 74 20 6f 66 20 69 6e 2d 6d 65 6d 6f   List of in-memo
3c70: 72 79 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  ry records */.  
3c80: 69 6e 74 20 69 4d 65 6d 6f 72 79 3b 20 20 20 20  int iMemory;    
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 72 65  /* Offset of fre
3cb0: 65 20 73 70 61 63 65 20 69 6e 20 6c 69 73 74 2e  e space in list.
3cc0: 61 4d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74  aMemory */.  int
3cd0: 20 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20 20   nMemory;       
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3cf0: 53 69 7a 65 20 6f 66 20 6c 69 73 74 2e 61 4d 65  Size of list.aMe
3d00: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3d10: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38  in bytes */.  u8
3d20: 20 62 55 73 65 50 4d 41 3b 20 20 20 20 20 20 20   bUsePMA;       
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d40: 20 54 72 75 65 20 69 66 20 6f 6e 65 20 6f 72 20   True if one or 
3d50: 6d 6f 72 65 20 50 4d 41 73 20 63 72 65 61 74 65  more PMAs create
3d60: 64 20 2a 2f 0a 20 20 75 38 20 62 55 73 65 54 68  d */.  u8 bUseTh
3d70: 72 65 61 64 73 3b 20 20 20 20 20 20 20 20 20 20  reads;          
3d80: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
3d90: 6f 20 75 73 65 20 62 61 63 6b 67 72 6f 75 6e 64  o use background
3da0: 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 75 38   threads */.  u8
3db0: 20 69 50 72 65 76 3b 20 20 20 20 20 20 20 20 20   iPrev;         
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3dd0: 20 50 72 65 76 69 6f 75 73 20 74 68 72 65 61 64   Previous thread
3de0: 20 75 73 65 64 20 74 6f 20 66 6c 75 73 68 20 50   used to flush P
3df0: 4d 41 20 2a 2f 0a 20 20 75 38 20 6e 54 61 73 6b  MA */.  u8 nTask
3e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3e10: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
3e20: 6f 66 20 61 54 61 73 6b 5b 5d 20 61 72 72 61 79  of aTask[] array
3e30: 20 2a 2f 0a 20 20 75 38 20 74 79 70 65 4d 61 73   */.  u8 typeMas
3e40: 6b 3b 0a 20 20 53 6f 72 74 53 75 62 74 61 73 6b  k;.  SortSubtask
3e50: 20 61 54 61 73 6b 5b 31 5d 3b 20 20 20 20 20 20   aTask[1];      
3e60: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d       /* One or m
3e70: 6f 72 65 20 73 75 62 74 61 73 6b 73 20 2a 2f 0a  ore subtasks */.
3e80: 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 53 4f 52 54  };..#define SORT
3e90: 45 52 5f 54 59 50 45 5f 49 4e 54 45 47 45 52 20  ER_TYPE_INTEGER 
3ea0: 30 78 30 31 0a 23 64 65 66 69 6e 65 20 53 4f 52  0x01.#define SOR
3eb0: 54 45 52 5f 54 59 50 45 5f 54 45 58 54 20 20 20  TER_TYPE_TEXT   
3ec0: 20 30 78 30 32 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20   0x02../*.** An 
3ed0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3ee0: 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74  following object
3ef0: 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
3f00: 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20   records out of 
3f10: 61 0a 2a 2a 20 50 4d 41 2c 20 69 6e 20 73 6f 72  a.** PMA, in sor
3f20: 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68 65 20  ted order.  The 
3f30: 6e 65 78 74 20 6b 65 79 20 74 6f 20 62 65 20 72  next key to be r
3f40: 65 61 64 20 69 73 20 63 61 63 68 65 64 20 69 6e  ead is cached in
3f50: 20 6e 4b 65 79 2f 61 4b 65 79 2e 0a 2a 2a 20 61   nKey/aKey..** a
3f60: 4b 65 79 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  Key might point 
3f70: 69 6e 74 6f 20 61 4d 61 70 20 6f 72 20 69 6e 74  into aMap or int
3f80: 6f 20 61 42 75 66 66 65 72 2e 20 20 49 66 20 6e  o aBuffer.  If n
3f90: 65 69 74 68 65 72 20 6f 66 20 74 68 6f 73 65 20  either of those 
3fa0: 6c 6f 63 61 74 69 6f 6e 73 0a 2a 2a 20 63 6f 6e  locations.** con
3fb0: 74 61 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75  tain a contiguou
3fc0: 73 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  s representation
3fd0: 20 6f 66 20 74 68 65 20 6b 65 79 2c 20 74 68 65   of the key, the
3fe0: 6e 20 61 41 6c 6c 6f 63 20 69 73 20 61 6c 6c 6f  n aAlloc is allo
3ff0: 63 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  cated.** and the
4000: 20 6b 65 79 20 69 73 20 63 6f 70 69 65 64 20 69   key is copied i
4010: 6e 74 6f 20 61 41 6c 6c 6f 63 20 61 6e 64 20 61  nto aAlloc and a
4020: 4b 65 79 20 69 73 20 6d 61 64 65 20 74 6f 20 70  Key is made to p
4030: 6f 69 74 6e 20 74 6f 20 61 41 6c 6c 6f 63 2e 0a  oitn to aAlloc..
4040: 2a 2a 0a 2a 2a 20 70 46 64 3d 3d 30 20 61 74 20  **.** pFd==0 at 
4050: 45 4f 46 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  EOF..*/.struct P
4060: 6d 61 52 65 61 64 65 72 20 7b 0a 20 20 69 36 34  maReader {.  i64
4070: 20 69 52 65 61 64 4f 66 66 3b 20 20 20 20 20 20   iReadOff;      
4080: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4090: 65 6e 74 20 72 65 61 64 20 6f 66 66 73 65 74 20  ent read offset 
40a0: 2a 2f 0a 20 20 69 36 34 20 69 45 6f 66 3b 20 20  */.  i64 iEof;  
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40c0: 20 2f 2a 20 31 20 62 79 74 65 20 70 61 73 74 20   /* 1 byte past 
40d0: 45 4f 46 20 66 6f 72 20 74 68 69 73 20 50 6d 61  EOF for this Pma
40e0: 52 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  Reader */.  int 
40f0: 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  nAlloc;         
4100: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
4110: 20 6f 66 20 73 70 61 63 65 20 61 74 20 61 41 6c   of space at aAl
4120: 6c 6f 63 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  loc */.  int nKe
4130: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
4140: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4150: 66 20 62 79 74 65 73 20 69 6e 20 6b 65 79 20 2a  f bytes in key *
4160: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
4170: 20 2a 70 46 64 3b 20 20 20 20 20 20 20 20 20 20   *pFd;          
4180: 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 77  /* File handle w
4190: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
41a0: 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 61 41 6c 6c  om */.  u8 *aAll
41b0: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  oc;             
41c0: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
41d0: 20 61 4b 65 79 20 69 66 20 61 42 75 66 66 65 72   aKey if aBuffer
41e0: 20 61 6e 64 20 70 4d 61 70 20 77 6f 6e 74 20 77   and pMap wont w
41f0: 6f 72 6b 20 2a 2f 0a 20 20 75 38 20 2a 61 4b 65  ork */.  u8 *aKe
4200: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
4210: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
4220: 74 6f 20 63 75 72 72 65 6e 74 20 6b 65 79 20 2a  to current key *
4230: 2f 0a 20 20 75 38 20 2a 61 42 75 66 66 65 72 3b  /.  u8 *aBuffer;
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4250: 2f 2a 20 43 75 72 72 65 6e 74 20 72 65 61 64 20  /* Current read 
4260: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
4270: 6e 42 75 66 66 65 72 3b 20 20 20 20 20 20 20 20  nBuffer;        
4280: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
4290: 6f 66 20 72 65 61 64 20 62 75 66 66 65 72 20 69  of read buffer i
42a0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38 20  n bytes */.  u8 
42b0: 2a 61 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20  *aMap;          
42c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
42d0: 74 65 72 20 74 6f 20 6d 61 70 70 69 6e 67 20 6f  ter to mapping o
42e0: 66 20 65 6e 74 69 72 65 20 66 69 6c 65 20 2a 2f  f entire file */
42f0: 0a 20 20 49 6e 63 72 4d 65 72 67 65 72 20 2a 70  .  IncrMerger *p
4300: 49 6e 63 72 3b 20 20 20 20 20 20 20 20 20 20 2f  Incr;          /
4310: 2a 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  * Incremental me
4320: 72 67 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  rger */.};../*.*
4330: 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 50 6d  * Normally, a Pm
4340: 61 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 69  aReader object i
4350: 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68 20  terates through 
4360: 61 6e 20 65 78 69 73 74 69 6e 67 20 50 4d 41 20  an existing PMA 
4370: 73 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68 69  stored .** withi
4380: 6e 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 48  n a temp file. H
4390: 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 50  owever, if the P
43a0: 6d 61 52 65 61 64 65 72 2e 70 49 6e 63 72 20 76  maReader.pIncr v
43b0: 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74  ariable points t
43c0: 6f 0a 2a 2a 20 61 6e 20 6f 62 6a 65 63 74 20 6f  o.** an object o
43d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
43e0: 74 79 70 65 2c 20 69 74 20 6d 61 79 20 62 65 20  type, it may be 
43f0: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 2f  used to iterate/
4400: 6d 65 72 67 65 20 74 68 72 6f 75 67 68 0a 2a 2a  merge through.**
4410: 20 6d 75 6c 74 69 70 6c 65 20 50 4d 41 73 20 73   multiple PMAs s
4420: 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 2e 0a 2a  imultaneously..*
4430: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74  *.** There are t
4440: 77 6f 20 74 79 70 65 73 20 6f 66 20 49 6e 63 72  wo types of Incr
4450: 4d 65 72 67 65 72 20 6f 62 6a 65 63 74 20 2d 20  Merger object - 
4460: 73 69 6e 67 6c 65 20 28 62 55 73 65 54 68 72 65  single (bUseThre
4470: 61 64 3d 3d 30 29 20 61 6e 64 20 0a 2a 2a 20 6d  ad==0) and .** m
4480: 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 28 62  ulti-threaded (b
4490: 55 73 65 54 68 72 65 61 64 3d 3d 31 29 2e 20 0a  UseThread==1). .
44a0: 2a 2a 0a 2a 2a 20 41 20 6d 75 6c 74 69 2d 74 68  **.** A multi-th
44b0: 72 65 61 64 65 64 20 49 6e 63 72 4d 65 72 67 65  readed IncrMerge
44c0: 72 20 6f 62 6a 65 63 74 20 75 73 65 73 20 74 77  r object uses tw
44d0: 6f 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  o temporary file
44e0: 73 20 2d 20 61 46 69 6c 65 5b 30 5d 20 0a 2a 2a  s - aFile[0] .**
44f0: 20 61 6e 64 20 61 46 69 6c 65 5b 31 5d 2e 20 4e   and aFile[1]. N
4500: 65 69 74 68 65 72 20 66 69 6c 65 20 69 73 20 61  either file is a
4510: 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77 20 74  llowed to grow t
4520: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6d 78 53 7a  o more than mxSz
4530: 20 62 79 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69   bytes in .** si
4540: 7a 65 2e 20 57 68 65 6e 20 74 68 65 20 49 6e 63  ze. When the Inc
4550: 72 4d 65 72 67 65 72 20 69 73 20 69 6e 69 74 69  rMerger is initi
4560: 61 6c 69 7a 65 64 2c 20 69 74 20 72 65 61 64 73  alized, it reads
4570: 20 65 6e 6f 75 67 68 20 64 61 74 61 20 66 72 6f   enough data fro
4580: 6d 20 0a 2a 2a 20 70 4d 65 72 67 65 72 20 74 6f  m .** pMerger to
4590: 20 70 6f 70 75 6c 61 74 65 20 61 46 69 6c 65 5b   populate aFile[
45a0: 30 5d 2e 20 49 74 20 74 68 65 6e 20 73 65 74 73  0]. It then sets
45b0: 20 76 61 72 69 61 62 6c 65 73 20 77 69 74 68 69   variables withi
45c0: 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73  n the .** corres
45d0: 70 6f 6e 64 69 6e 67 20 50 6d 61 52 65 61 64 65  ponding PmaReade
45e0: 72 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 61 64  r object to read
45f0: 20 66 72 6f 6d 20 74 68 61 74 20 66 69 6c 65 20   from that file 
4600: 61 6e 64 20 6b 69 63 6b 73 20 6f 66 66 20 0a 2a  and kicks off .*
4610: 2a 20 61 20 62 61 63 6b 67 72 6f 75 6e 64 20 74  * a background t
4620: 68 72 65 61 64 20 74 6f 20 70 6f 70 75 6c 61 74  hread to populat
4630: 65 20 61 46 69 6c 65 5b 31 5d 20 77 69 74 68 20  e aFile[1] with 
4640: 74 68 65 20 6e 65 78 74 20 6d 78 53 7a 20 62 79  the next mxSz by
4650: 74 65 73 20 6f 66 20 0a 2a 2a 20 73 6f 72 74 65  tes of .** sorte
4660: 64 20 72 65 63 6f 72 64 20 64 61 74 61 20 66 72  d record data fr
4670: 6f 6d 20 70 4d 65 72 67 65 72 2e 20 0a 2a 2a 0a  om pMerger. .**.
4680: 2a 2a 20 57 68 65 6e 20 74 68 65 20 50 6d 61 52  ** When the PmaR
4690: 65 61 64 65 72 20 72 65 61 63 68 65 73 20 74 68  eader reaches th
46a0: 65 20 65 6e 64 20 6f 66 20 61 46 69 6c 65 5b 30  e end of aFile[0
46b0: 5d 2c 20 69 74 20 62 6c 6f 63 6b 73 20 75 6e 74  ], it blocks unt
46c0: 69 6c 20 74 68 65 0a 2a 2a 20 62 61 63 6b 67 72  il the.** backgr
46d0: 6f 75 6e 64 20 74 68 72 65 61 64 20 68 61 73 20  ound thread has 
46e0: 66 69 6e 69 73 68 65 64 20 70 6f 70 75 6c 61 74  finished populat
46f0: 69 6e 67 20 61 46 69 6c 65 5b 31 5d 2e 20 49 74  ing aFile[1]. It
4700: 20 74 68 65 6e 20 65 78 63 68 61 6e 67 65 73 0a   then exchanges.
4710: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
4720: 6f 66 20 74 68 65 20 61 46 69 6c 65 5b 30 5d 20  of the aFile[0] 
4730: 61 6e 64 20 61 46 69 6c 65 5b 31 5d 20 76 61 72  and aFile[1] var
4740: 69 61 62 6c 65 73 20 77 69 74 68 69 6e 20 74 68  iables within th
4750: 69 73 20 73 74 72 75 63 74 75 72 65 2c 0a 2a 2a  is structure,.**
4760: 20 73 65 74 73 20 74 68 65 20 50 6d 61 52 65 61   sets the PmaRea
4770: 64 65 72 20 66 69 65 6c 64 73 20 74 6f 20 72 65  der fields to re
4780: 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 65 77 20  ad from the new 
4790: 61 46 69 6c 65 5b 30 5d 20 61 6e 64 20 6b 69 63  aFile[0] and kic
47a0: 6b 73 20 6f 66 66 0a 2a 2a 20 61 6e 6f 74 68 65  ks off.** anothe
47b0: 72 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72  r background thr
47c0: 65 61 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ead to populate 
47d0: 74 68 65 20 6e 65 77 20 61 46 69 6c 65 5b 31 5d  the new aFile[1]
47e0: 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 75 6e 74  . And so on, unt
47f0: 69 6c 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  il.** the conten
4800: 74 73 20 6f 66 20 70 4d 65 72 67 65 72 20 61 72  ts of pMerger ar
4810: 65 20 65 78 68 61 75 73 74 65 64 2e 0a 2a 2a 0a  e exhausted..**.
4820: 2a 2a 20 41 20 73 69 6e 67 6c 65 2d 74 68 72 65  ** A single-thre
4830: 61 64 65 64 20 49 6e 63 72 4d 65 72 67 65 72 20  aded IncrMerger 
4840: 64 6f 65 73 20 6e 6f 74 20 6f 70 65 6e 20 61 6e  does not open an
4850: 79 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  y temporary file
4860: 73 20 6f 66 20 69 74 73 0a 2a 2a 20 6f 77 6e 2e  s of its.** own.
4870: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 68 61 73   Instead, it has
4880: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
4890: 73 20 74 6f 20 6d 78 53 7a 20 62 79 74 65 73 20  s to mxSz bytes 
48a0: 6f 66 20 73 70 61 63 65 20 62 65 67 69 6e 6e 69  of space beginni
48b0: 6e 67 0a 2a 2a 20 61 74 20 6f 66 66 73 65 74 20  ng.** at offset 
48c0: 69 53 74 61 72 74 4f 66 66 20 6f 66 20 66 69 6c  iStartOff of fil
48d0: 65 20 70 54 61 73 6b 2d 3e 66 69 6c 65 32 2e 20  e pTask->file2. 
48e0: 41 6e 64 20 69 6e 73 74 65 61 64 20 6f 66 20 75  And instead of u
48f0: 73 69 6e 67 20 61 20 0a 2a 2a 20 62 61 63 6b 67  sing a .** backg
4900: 72 6f 75 6e 64 20 74 68 72 65 61 64 20 74 6f 20  round thread to 
4910: 70 72 65 70 61 72 65 20 64 61 74 61 20 66 6f 72  prepare data for
4920: 20 74 68 65 20 50 6d 61 52 65 61 64 65 72 2c 20   the PmaReader, 
4930: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  with a single.**
4940: 20 74 68 72 65 61 64 65 64 20 49 6e 63 72 4d 65   threaded IncrMe
4950: 72 67 65 72 20 74 68 65 20 61 6c 6c 6f 63 61 74  rger the allocat
4960: 65 20 70 61 72 74 20 6f 66 20 70 54 61 73 6b 2d  e part of pTask-
4970: 3e 66 69 6c 65 32 20 69 73 20 22 72 65 66 69 6c  >file2 is "refil
4980: 6c 65 64 22 20 77 69 74 68 0a 2a 2a 20 6b 65 79  led" with.** key
4990: 73 20 66 72 6f 6d 20 70 4d 65 72 67 65 72 20 62  s from pMerger b
49a0: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 74 68  y the calling th
49b0: 72 65 61 64 20 77 68 65 6e 65 76 65 72 20 74 68  read whenever th
49c0: 65 20 50 6d 61 52 65 61 64 65 72 20 72 75 6e 73  e PmaReader runs
49d0: 20 6f 75 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e   out.** of data.
49e0: 0a 2a 2f 0a 73 74 72 75 63 74 20 49 6e 63 72 4d  .*/.struct IncrM
49f0: 65 72 67 65 72 20 7b 0a 20 20 53 6f 72 74 53 75  erger {.  SortSu
4a00: 62 74 61 73 6b 20 2a 70 54 61 73 6b 3b 20 20 20  btask *pTask;   
4a10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 73            /* Tas
4a20: 6b 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  k that owns this
4a30: 20 6d 65 72 67 65 72 20 2a 2f 0a 20 20 4d 65 72   merger */.  Mer
4a40: 67 65 45 6e 67 69 6e 65 20 2a 70 4d 65 72 67 65  geEngine *pMerge
4a50: 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
4a60: 4d 65 72 67 65 20 65 6e 67 69 6e 65 20 74 68 72  Merge engine thr
4a70: 65 61 64 20 72 65 61 64 73 20 64 61 74 61 20 66  ead reads data f
4a80: 72 6f 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53 74  rom */.  i64 iSt
4a90: 61 72 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20  artOff;         
4aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
4ab0: 65 74 20 74 6f 20 73 74 61 72 74 20 77 72 69 74  et to start writ
4ac0: 69 6e 67 20 66 69 6c 65 20 61 74 20 2a 2f 0a 20  ing file at */. 
4ad0: 20 69 6e 74 20 6d 78 53 7a 3b 20 20 20 20 20 20   int mxSz;      
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 62 79 74 65   /* Maximum byte
4b00: 73 20 6f 66 20 64 61 74 61 20 74 6f 20 73 74 6f  s of data to sto
4b10: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66  re */.  int bEof
4b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4b30: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
4b40: 6f 20 74 72 75 65 20 77 68 65 6e 20 6d 65 72 67  o true when merg
4b50: 65 20 69 73 20 66 69 6e 69 73 68 65 64 20 2a 2f  e is finished */
4b60: 0a 20 20 69 6e 74 20 62 55 73 65 54 68 72 65 61  .  int bUseThrea
4b70: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
4b80: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
4b90: 65 20 61 20 62 67 20 74 68 72 65 61 64 20 66 6f  e a bg thread fo
4ba0: 72 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  r this object */
4bb0: 0a 20 20 53 6f 72 74 65 72 46 69 6c 65 20 61 46  .  SorterFile aF
4bc0: 69 6c 65 5b 32 5d 3b 20 20 20 20 20 20 20 20 20  ile[2];         
4bd0: 20 20 20 2f 2a 20 61 46 69 6c 65 5b 30 5d 20 66     /* aFile[0] f
4be0: 6f 72 20 72 65 61 64 69 6e 67 2c 20 5b 31 5d 20  or reading, [1] 
4bf0: 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 7d  for writing */.}
4c00: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
4c10: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
4c20: 65 63 74 20 69 73 20 75 73 65 64 20 66 6f 72 20  ect is used for 
4c30: 77 72 69 74 69 6e 67 20 61 20 50 4d 41 2e 0a 2a  writing a PMA..*
4c40: 2a 0a 2a 2a 20 54 68 65 20 50 4d 41 20 69 73 20  *.** The PMA is 
4c50: 77 72 69 74 74 65 6e 20 6f 6e 65 20 72 65 63 6f  written one reco
4c60: 72 64 20 61 74 20 61 20 74 69 6d 65 2e 20 20 45  rd at a time.  E
4c70: 61 63 68 20 72 65 63 6f 72 64 20 69 73 20 6f 66  ach record is of
4c80: 20 61 6e 20 61 72 62 69 74 72 61 72 79 0a 2a 2a   an arbitrary.**
4c90: 20 73 69 7a 65 2e 20 20 42 75 74 20 49 2f 4f 20   size.  But I/O 
4ca0: 69 73 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  is more efficien
4cb0: 74 20 69 66 20 69 74 20 6f 63 63 75 72 73 20 69  t if it occurs i
4cc0: 6e 20 70 61 67 65 2d 73 69 7a 65 64 20 62 6c 6f  n page-sized blo
4cd0: 63 6b 73 20 77 68 65 72 65 0a 2a 2a 20 65 61 63  cks where.** eac
4ce0: 68 20 62 6c 6f 63 6b 20 69 73 20 61 6c 69 67 6e  h block is align
4cf0: 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62 6f 75  ed on a page bou
4d00: 6e 64 61 72 79 2e 20 20 54 68 69 73 20 6f 62 6a  ndary.  This obj
4d10: 65 63 74 20 63 61 63 68 65 73 20 77 72 69 74 65  ect caches write
4d20: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 50 4d 41 20  s to.** the PMA 
4d30: 73 6f 20 74 68 61 74 20 61 6c 69 67 6e 65 64 2c  so that aligned,
4d40: 20 70 61 67 65 2d 73 69 7a 65 20 62 6c 6f 63 6b   page-size block
4d50: 73 20 61 72 65 20 77 72 69 74 74 65 6e 2e 0a 2a  s are written..*
4d60: 2f 0a 73 74 72 75 63 74 20 50 6d 61 57 72 69 74  /.struct PmaWrit
4d70: 65 72 20 7b 0a 20 20 69 6e 74 20 65 46 57 45 72  er {.  int eFWEr
4d80: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
4d90: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65         /* Non-ze
4da0: 72 6f 20 69 66 20 69 6e 20 61 6e 20 65 72 72 6f  ro if in an erro
4db0: 72 20 73 74 61 74 65 20 2a 2f 0a 20 20 75 38 20  r state */.  u8 
4dc0: 2a 61 42 75 66 66 65 72 3b 20 20 20 20 20 20 20  *aBuffer;       
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4de0: 50 6f 69 6e 74 65 72 20 74 6f 20 77 72 69 74 65  Pointer to write
4df0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
4e00: 20 6e 42 75 66 66 65 72 3b 20 20 20 20 20 20 20   nBuffer;       
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e20: 53 69 7a 65 20 6f 66 20 77 72 69 74 65 20 62 75  Size of write bu
4e30: 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
4e40: 0a 20 20 69 6e 74 20 69 42 75 66 53 74 61 72 74  .  int iBufStart
4e50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4e60: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
4e70: 20 6f 66 20 62 75 66 66 65 72 20 74 6f 20 77 72   of buffer to wr
4e80: 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 42 75  ite */.  int iBu
4e90: 66 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  fEnd;           
4ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
4eb0: 20 62 79 74 65 20 6f 66 20 62 75 66 66 65 72 20   byte of buffer 
4ec0: 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 36  to write */.  i6
4ed0: 34 20 69 57 72 69 74 65 4f 66 66 3b 20 20 20 20  4 iWriteOff;    
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4ef0: 20 4f 66 66 73 65 74 20 6f 66 20 73 74 61 72 74   Offset of start
4f00: 20 6f 66 20 62 75 66 66 65 72 20 69 6e 20 66 69   of buffer in fi
4f10: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
4f20: 66 69 6c 65 20 2a 70 46 64 3b 20 20 20 20 20 20  file *pFd;      
4f30: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
4f40: 68 61 6e 64 6c 65 20 74 6f 20 77 72 69 74 65 20  handle to write 
4f50: 74 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  to */.};../*.** 
4f60: 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 74  This object is t
4f70: 68 65 20 68 65 61 64 65 72 20 6f 6e 20 61 20 73  he header on a s
4f80: 69 6e 67 6c 65 20 72 65 63 6f 72 64 20 77 68 69  ingle record whi
4f90: 6c 65 20 74 68 61 74 20 72 65 63 6f 72 64 20 69  le that record i
4fa0: 73 20 62 65 69 6e 67 0a 2a 2a 20 68 65 6c 64 20  s being.** held 
4fb0: 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 70 72  in memory and pr
4fc0: 69 6f 72 20 74 6f 20 62 65 69 6e 67 20 77 72 69  ior to being wri
4fd0: 74 74 65 6e 20 6f 75 74 20 61 73 20 70 61 72 74  tten out as part
4fe0: 20 6f 66 20 61 20 50 4d 41 2e 0a 2a 2a 0a 2a 2a   of a PMA..**.**
4ff0: 20 48 6f 77 20 74 68 65 20 6c 69 6e 6b 65 64 20   How the linked 
5000: 6c 69 73 74 20 69 73 20 63 6f 6e 6e 65 63 74 65  list is connecte
5010: 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 68 6f 77  d depends on how
5020: 20 6d 65 6d 6f 72 79 20 69 73 20 62 65 69 6e 67   memory is being
5030: 20 6d 61 6e 61 67 65 64 0a 2a 2a 20 62 79 20 74   managed.** by t
5040: 68 69 73 20 6d 6f 64 75 6c 65 2e 20 49 66 20 75  his module. If u
5050: 73 69 6e 67 20 61 20 73 65 70 61 72 61 74 65 20  sing a separate 
5060: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 65  allocation for e
5070: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  ach in-memory re
5080: 63 6f 72 64 0a 2a 2a 20 28 56 64 62 65 53 6f 72  cord.** (VdbeSor
5090: 74 65 72 2e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79  ter.list.aMemory
50a0: 3d 3d 30 29 2c 20 74 68 65 6e 20 74 68 65 20 6c  ==0), then the l
50b0: 69 73 74 20 69 73 20 61 6c 77 61 79 73 20 63 6f  ist is always co
50c0: 6e 6e 65 63 74 65 64 20 75 73 69 6e 67 20 74 68  nnected using th
50d0: 65 0a 2a 2a 20 53 6f 72 74 65 72 52 65 63 6f 72  e.** SorterRecor
50e0: 64 2e 75 2e 70 4e 65 78 74 20 70 6f 69 6e 74 65  d.u.pNext pointe
50f0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  rs..**.** Or, if
5100: 20 75 73 69 6e 67 20 74 68 65 20 73 69 6e 67 6c   using the singl
5110: 65 20 6c 61 72 67 65 20 61 6c 6c 6f 63 61 74 69  e large allocati
5120: 6f 6e 20 6d 65 74 68 6f 64 20 28 56 64 62 65 53  on method (VdbeS
5130: 6f 72 74 65 72 2e 6c 69 73 74 2e 61 4d 65 6d 6f  orter.list.aMemo
5140: 72 79 21 3d 30 29 2c 0a 2a 2a 20 74 68 65 6e 20  ry!=0),.** then 
5150: 77 68 69 6c 65 20 72 65 63 6f 72 64 73 20 61 72  while records ar
5160: 65 20 62 65 69 6e 67 20 61 63 63 75 6d 75 6c 61  e being accumula
5170: 74 65 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  ted the list is 
5180: 6c 69 6e 6b 65 64 20 75 73 69 6e 67 20 74 68 65  linked using the
5190: 0a 2a 2a 20 53 6f 72 74 65 72 52 65 63 6f 72 64  .** SorterRecord
51a0: 2e 75 2e 69 4e 65 78 74 20 6f 66 66 73 65 74 2e  .u.iNext offset.
51b0: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
51c0: 20 74 68 65 20 61 4d 65 6d 6f 72 79 5b 5d 20 61   the aMemory[] a
51d0: 72 72 61 79 20 6d 61 79 0a 2a 2a 20 62 65 20 73  rray may.** be s
51e0: 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 29 65  qlite3Realloc()e
51f0: 64 20 77 68 69 6c 65 20 72 65 63 6f 72 64 73 20  d while records 
5200: 61 72 65 20 62 65 69 6e 67 20 61 63 63 75 6d 75  are being accumu
5210: 6c 61 74 65 64 2e 20 4f 6e 63 65 20 74 68 65 20  lated. Once the 
5220: 56 4d 0a 2a 2a 20 68 61 73 20 66 69 6e 69 73 68  VM.** has finish
5230: 65 64 20 70 61 73 73 69 6e 67 20 72 65 63 6f 72  ed passing recor
5240: 64 73 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72  ds to the sorter
5250: 2c 20 6f 72 20 77 68 65 6e 20 74 68 65 20 69 6e  , or when the in
5260: 2d 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 0a 2a  -memory buffer.*
5270: 2a 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 20 6c  * is full, the l
5280: 69 73 74 20 69 73 20 73 6f 72 74 65 64 2e 20 41  ist is sorted. A
5290: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 6f  s part of the so
52a0: 72 74 69 6e 67 20 70 72 6f 63 65 73 73 2c 20 69  rting process, i
52b0: 74 20 69 73 0a 2a 2a 20 63 6f 6e 76 65 72 74 65  t is.** converte
52c0: 64 20 74 6f 20 75 73 65 20 74 68 65 20 53 6f 72  d to use the Sor
52d0: 74 65 72 52 65 63 6f 72 64 2e 75 2e 70 4e 65 78  terRecord.u.pNex
52e0: 74 20 70 6f 69 6e 74 65 72 73 2e 20 53 65 65 20  t pointers. See 
52f0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 76 64 62 65  function.** vdbe
5300: 53 6f 72 74 65 72 53 6f 72 74 28 29 20 66 6f 72  SorterSort() for
5310: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 73 74 72   details..*/.str
5320: 75 63 74 20 53 6f 72 74 65 72 52 65 63 6f 72 64  uct SorterRecord
5330: 20 7b 0a 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20   {.  int nVal;  
5340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5350: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
5360: 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20 62 79  the record in by
5370: 74 65 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b  tes */.  union {
5380: 0a 20 20 20 20 53 6f 72 74 65 72 52 65 63 6f 72  .    SorterRecor
5390: 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  d *pNext;       
53a0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
53b0: 20 6e 65 78 74 20 72 65 63 6f 72 64 20 69 6e 20   next record in 
53c0: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  list */.    int 
53d0: 69 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  iNext;          
53e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
53f0: 73 65 74 20 77 69 74 68 69 6e 20 61 4d 65 6d 6f  set within aMemo
5400: 72 79 20 6f 66 20 6e 65 78 74 20 72 65 63 6f 72  ry of next recor
5410: 64 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 2f 2a  d */.  } u;.  /*
5420: 20 54 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   The data for th
5430: 65 20 72 65 63 6f 72 64 20 69 6d 6d 65 64 69 61  e record immedia
5440: 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 69  tely follows thi
5450: 73 20 68 65 61 64 65 72 20 2a 2f 0a 7d 3b 0a 0a  s header */.};..
5460: 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
5470: 74 65 72 20 74 6f 20 74 68 65 20 62 75 66 66 65  ter to the buffe
5480: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
5490: 20 72 65 63 6f 72 64 20 64 61 74 61 20 66 6f 72   record data for
54a0: 20 53 6f 72 74 65 72 52 65 63 6f 72 64 0a 2a 2a   SorterRecord.**
54b0: 20 6f 62 6a 65 63 74 20 70 2e 20 53 68 6f 75 6c   object p. Shoul
54c0: 64 20 62 65 20 75 73 65 64 20 61 73 20 69 66 3a  d be used as if:
54d0: 0a 2a 2a 0a 2a 2a 20 20 20 76 6f 69 64 20 2a 53  .**.**   void *S
54e0: 52 56 41 4c 28 53 6f 72 74 65 72 52 65 63 6f 72  RVAL(SorterRecor
54f0: 64 20 2a 70 29 20 7b 20 72 65 74 75 72 6e 20 28  d *p) { return (
5500: 76 6f 69 64 2a 29 26 70 5b 31 5d 3b 20 7d 0a 2a  void*)&p[1]; }.*
5510: 2f 0a 23 64 65 66 69 6e 65 20 53 52 56 41 4c 28  /.#define SRVAL(
5520: 70 29 20 28 28 76 6f 69 64 2a 29 28 28 53 6f 72  p) ((void*)((Sor
5530: 74 65 72 52 65 63 6f 72 64 2a 29 28 70 29 20 2b  terRecord*)(p) +
5540: 20 31 29 29 0a 0a 0a 2f 2a 20 4d 61 78 69 6d 75   1)).../* Maximu
5550: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 50 4d 41 73  m number of PMAs
5560: 20 74 68 61 74 20 61 20 73 69 6e 67 6c 65 20 4d   that a single M
5570: 65 72 67 65 45 6e 67 69 6e 65 20 63 61 6e 20 6d  ergeEngine can m
5580: 65 72 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  erge */.#define 
5590: 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45  SORTER_MAX_MERGE
55a0: 5f 43 4f 55 4e 54 20 31 36 0a 0a 73 74 61 74 69  _COUNT 16..stati
55b0: 63 20 69 6e 74 20 76 64 62 65 49 6e 63 72 53 77  c int vdbeIncrSw
55c0: 61 70 28 49 6e 63 72 4d 65 72 67 65 72 2a 29 3b  ap(IncrMerger*);
55d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
55e0: 65 49 6e 63 72 46 72 65 65 28 49 6e 63 72 4d 65  eIncrFree(IncrMe
55f0: 72 67 65 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  rger *);../*.** 
5600: 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
5610: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
5620: 20 50 6d 61 52 65 61 64 65 72 20 6f 62 6a 65 63   PmaReader objec
5630: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  t passed as the.
5640: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6c 6c  ** argument. All
5650: 20 73 74 72 75 63 74 75 72 65 20 66 69 65 6c 64   structure field
5660: 73 20 61 72 65 20 73 65 74 20 74 6f 20 7a 65 72  s are set to zer
5670: 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  o before returni
5680: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
5690: 69 64 20 76 64 62 65 50 6d 61 52 65 61 64 65 72  id vdbePmaReader
56a0: 43 6c 65 61 72 28 50 6d 61 52 65 61 64 65 72 20  Clear(PmaReader 
56b0: 2a 70 52 65 61 64 72 29 7b 0a 20 20 73 71 6c 69  *pReadr){.  sqli
56c0: 74 65 33 5f 66 72 65 65 28 70 52 65 61 64 72 2d  te3_free(pReadr-
56d0: 3e 61 41 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69  >aAlloc);.  sqli
56e0: 74 65 33 5f 66 72 65 65 28 70 52 65 61 64 72 2d  te3_free(pReadr-
56f0: 3e 61 42 75 66 66 65 72 29 3b 0a 20 20 69 66 28  >aBuffer);.  if(
5700: 20 70 52 65 61 64 72 2d 3e 61 4d 61 70 20 29 20   pReadr->aMap ) 
5710: 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
5720: 28 70 52 65 61 64 72 2d 3e 70 46 64 2c 20 30 2c  (pReadr->pFd, 0,
5730: 20 70 52 65 61 64 72 2d 3e 61 4d 61 70 29 3b 0a   pReadr->aMap);.
5740: 20 20 76 64 62 65 49 6e 63 72 46 72 65 65 28 70    vdbeIncrFree(p
5750: 52 65 61 64 72 2d 3e 70 49 6e 63 72 29 3b 0a 20  Readr->pIncr);. 
5760: 20 6d 65 6d 73 65 74 28 70 52 65 61 64 72 2c 20   memset(pReadr, 
5770: 30 2c 20 73 69 7a 65 6f 66 28 50 6d 61 52 65 61  0, sizeof(PmaRea
5780: 64 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  der));.}../*.** 
5790: 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6e 42  Read the next nB
57a0: 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
57b0: 61 20 66 72 6f 6d 20 74 68 65 20 50 4d 41 20 70  a from the PMA p
57c0: 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  ..** If successf
57d0: 75 6c 2c 20 73 65 74 20 2a 70 70 4f 75 74 20 74  ul, set *ppOut t
57e0: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
57f0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
5800: 68 65 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 72  he data.** and r
5810: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
5820: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
5830: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
5840: 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
5850: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  .** error code..
5860: 2a 2a 0a 2a 2a 20 54 68 65 20 62 75 66 66 65 72  **.** The buffer
5870: 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 70   returned in *pp
5880: 4f 75 74 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69  Out is only vali
5890: 64 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e  d until the.** n
58a0: 65 78 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ext call to this
58b0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
58c0: 61 74 69 63 20 69 6e 74 20 76 64 62 65 50 6d 61  atic int vdbePma
58d0: 52 65 61 64 42 6c 6f 62 28 0a 20 20 50 6d 61 52  ReadBlob(.  PmaR
58e0: 65 61 64 65 72 20 2a 70 2c 20 20 20 20 20 20 20  eader *p,       
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
5900: 6d 61 52 65 61 64 65 72 20 66 72 6f 6d 20 77 68  maReader from wh
5910: 69 63 68 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ich to take the 
5920: 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  blob */.  int nB
5930: 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
5940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
5950: 65 73 20 6f 66 20 64 61 74 61 20 74 6f 20 72 65  es of data to re
5960: 61 64 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 4f  ad */.  u8 **ppO
5970: 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
5980: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
5990: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
59a0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 64 61 74  r containing dat
59b0: 61 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 42  a */.){.  int iB
59c0: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
59d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
59e0: 73 65 74 20 77 69 74 68 69 6e 20 62 75 66 66 65  set within buffe
59f0: 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  r to read from *
5a00: 2f 0a 20 20 69 6e 74 20 6e 41 76 61 69 6c 3b 20  /.  int nAvail; 
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
5a30: 64 61 74 61 20 61 76 61 69 6c 61 62 6c 65 20 69  data available i
5a40: 6e 20 62 75 66 66 65 72 20 2a 2f 0a 0a 20 20 69  n buffer */..  i
5a50: 66 28 20 70 2d 3e 61 4d 61 70 20 29 7b 0a 20 20  f( p->aMap ){.  
5a60: 20 20 2a 70 70 4f 75 74 20 3d 20 26 70 2d 3e 61    *ppOut = &p->a
5a70: 4d 61 70 5b 70 2d 3e 69 52 65 61 64 4f 66 66 5d  Map[p->iReadOff]
5a80: 3b 0a 20 20 20 20 70 2d 3e 69 52 65 61 64 4f 66  ;.    p->iReadOf
5a90: 66 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  f += nByte;.    
5aa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5ab0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
5ac0: 20 70 2d 3e 61 42 75 66 66 65 72 20 29 3b 0a 0a   p->aBuffer );..
5ad0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
5ae0: 20 6e 6f 20 6d 6f 72 65 20 64 61 74 61 20 74 6f   no more data to
5af0: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
5b00: 65 20 62 75 66 66 65 72 2c 20 72 65 61 64 20 74  e buffer, read t
5b10: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 70 2d  he next .  ** p-
5b20: 3e 6e 42 75 66 66 65 72 20 62 79 74 65 73 20 6f  >nBuffer bytes o
5b30: 66 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  f data from the 
5b40: 66 69 6c 65 20 69 6e 74 6f 20 69 74 2e 20 4f 72  file into it. Or
5b50: 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6c  , if there are l
5b60: 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70 2d  ess.  ** than p-
5b70: 3e 6e 42 75 66 66 65 72 20 62 79 74 65 73 20 72  >nBuffer bytes r
5b80: 65 6d 61 69 6e 69 6e 67 20 69 6e 20 74 68 65 20  emaining in the 
5b90: 50 4d 41 2c 20 72 65 61 64 20 61 6c 6c 20 72 65  PMA, read all re
5ba0: 6d 61 69 6e 69 6e 67 20 64 61 74 61 2e 20 20 2a  maining data.  *
5bb0: 2f 0a 20 20 69 42 75 66 20 3d 20 70 2d 3e 69 52  /.  iBuf = p->iR
5bc0: 65 61 64 4f 66 66 20 25 20 70 2d 3e 6e 42 75 66  eadOff % p->nBuf
5bd0: 66 65 72 3b 0a 20 20 69 66 28 20 69 42 75 66 3d  fer;.  if( iBuf=
5be0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52  =0 ){.    int nR
5bf0: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
5c00: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
5c10: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 64 69   to read from di
5c20: 73 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  sk */.    int rc
5c30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5c40: 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
5c50: 65 33 4f 73 52 65 61 64 28 29 20 72 65 74 75 72  e3OsRead() retur
5c60: 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 2f  n code */..    /
5c70: 2a 20 44 65 74 65 72 6d 69 6e 65 20 68 6f 77 20  * Determine how 
5c80: 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 64 61  many bytes of da
5c90: 74 61 20 74 6f 20 72 65 61 64 2e 20 2a 2f 0a 20  ta to read. */. 
5ca0: 20 20 20 69 66 28 20 28 70 2d 3e 69 45 6f 66 20     if( (p->iEof 
5cb0: 2d 20 70 2d 3e 69 52 65 61 64 4f 66 66 29 20 3e  - p->iReadOff) >
5cc0: 20 28 69 36 34 29 70 2d 3e 6e 42 75 66 66 65 72   (i64)p->nBuffer
5cd0: 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 61 64 20   ){.      nRead 
5ce0: 3d 20 70 2d 3e 6e 42 75 66 66 65 72 3b 0a 20 20  = p->nBuffer;.  
5cf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
5d00: 52 65 61 64 20 3d 20 28 69 6e 74 29 28 70 2d 3e  Read = (int)(p->
5d10: 69 45 6f 66 20 2d 20 70 2d 3e 69 52 65 61 64 4f  iEof - p->iReadO
5d20: 66 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ff);.    }.    a
5d30: 73 73 65 72 74 28 20 6e 52 65 61 64 3e 30 20 29  ssert( nRead>0 )
5d40: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 72 20  ;..    /* Readr 
5d50: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66 69  data from the fi
5d60: 6c 65 2e 20 52 65 74 75 72 6e 20 65 61 72 6c 79  le. Return early
5d70: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
5d80: 75 72 73 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  urs. */.    rc =
5d90: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
5da0: 2d 3e 70 46 64 2c 20 70 2d 3e 61 42 75 66 66 65  ->pFd, p->aBuffe
5db0: 72 2c 20 6e 52 65 61 64 2c 20 70 2d 3e 69 52 65  r, nRead, p->iRe
5dc0: 61 64 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  adOff);.    asse
5dd0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49  rt( rc!=SQLITE_I
5de0: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
5df0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
5e00: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5e10: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 41 76 61  n rc;.  }.  nAva
5e20: 69 6c 20 3d 20 70 2d 3e 6e 42 75 66 66 65 72 20  il = p->nBuffer 
5e30: 2d 20 69 42 75 66 3b 20 0a 0a 20 20 69 66 28 20  - iBuf; ..  if( 
5e40: 6e 42 79 74 65 3c 3d 6e 41 76 61 69 6c 20 29 7b  nByte<=nAvail ){
5e50: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
5e60: 65 73 74 65 64 20 64 61 74 61 20 69 73 20 61 76  ested data is av
5e70: 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 69  ailable in the i
5e80: 6e 2d 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e  n-memory buffer.
5e90: 20 49 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   In this.    ** 
5ea0: 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f  case there is no
5eb0: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20   need to make a 
5ec0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 61 74 61  copy of the data
5ed0: 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20  , just return a 
5ee0: 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20  .    ** pointer 
5ef0: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
5f00: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 20  to the caller.  
5f10: 2a 2f 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20  */.    *ppOut = 
5f20: 26 70 2d 3e 61 42 75 66 66 65 72 5b 69 42 75 66  &p->aBuffer[iBuf
5f30: 5d 3b 0a 20 20 20 20 70 2d 3e 69 52 65 61 64 4f  ];.    p->iReadO
5f40: 66 66 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  ff += nByte;.  }
5f50: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
5f60: 20 72 65 71 75 65 73 74 65 64 20 64 61 74 61 20   requested data 
5f70: 69 73 20 6e 6f 74 20 61 6c 6c 20 61 76 61 69 6c  is not all avail
5f80: 61 62 6c 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  able in the in-m
5f90: 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 0a 20 20  emory buffer..  
5fa0: 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
5fb0: 65 2c 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  e, allocate spac
5fc0: 65 20 61 74 20 70 2d 3e 61 41 6c 6c 6f 63 5b 5d  e at p->aAlloc[]
5fd0: 20 74 6f 20 63 6f 70 79 20 74 68 65 20 72 65 71   to copy the req
5fe0: 75 65 73 74 65 64 0a 20 20 20 20 2a 2a 20 72 61  uested.    ** ra
5ff0: 6e 67 65 20 69 6e 74 6f 2e 20 54 68 65 6e 20 72  nge into. Then r
6000: 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20  eturn a copy of 
6010: 70 6f 69 6e 74 65 72 20 70 2d 3e 61 41 6c 6c 6f  pointer p->aAllo
6020: 63 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  c to the caller.
6030: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65    */.    int nRe
6040: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
6050: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
6060: 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 63 6f 70  remaining to cop
6070: 79 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 78 74  y */..    /* Ext
6080: 65 6e 64 20 74 68 65 20 70 2d 3e 61 41 6c 6c 6f  end the p->aAllo
6090: 63 5b 5d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  c[] allocation i
60a0: 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
60b0: 20 20 20 69 66 28 20 70 2d 3e 6e 41 6c 6c 6f 63     if( p->nAlloc
60c0: 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  <nByte ){.      
60d0: 75 38 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20  u8 *aNew;.      
60e0: 69 6e 74 20 6e 4e 65 77 20 3d 20 4d 41 58 28 31  int nNew = MAX(1
60f0: 32 38 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 29  28, p->nAlloc*2)
6100: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e  ;.      while( n
6110: 42 79 74 65 3e 6e 4e 65 77 20 29 20 6e 4e 65 77  Byte>nNew ) nNew
6120: 20 3d 20 6e 4e 65 77 2a 32 3b 0a 20 20 20 20 20   = nNew*2;.     
6130: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 52   aNew = sqlite3R
6140: 65 61 6c 6c 6f 63 28 70 2d 3e 61 41 6c 6c 6f 63  ealloc(p->aAlloc
6150: 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 69  , nNew);.      i
6160: 66 28 20 21 61 4e 65 77 20 29 20 72 65 74 75 72  f( !aNew ) retur
6170: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
6180: 4b 50 54 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 41  KPT;.      p->nA
6190: 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20  lloc = nNew;.   
61a0: 20 20 20 70 2d 3e 61 41 6c 6c 6f 63 20 3d 20 61     p->aAlloc = a
61b0: 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  New;.    }..    
61c0: 2f 2a 20 43 6f 70 79 20 61 73 20 6d 75 63 68 20  /* Copy as much 
61d0: 64 61 74 61 20 61 73 20 69 73 20 61 76 61 69 6c  data as is avail
61e0: 61 62 6c 65 20 69 6e 20 74 68 65 20 62 75 66 66  able in the buff
61f0: 65 72 20 69 6e 74 6f 20 74 68 65 20 73 74 61 72  er into the star
6200: 74 20 6f 66 0a 20 20 20 20 2a 2a 20 70 2d 3e 61  t of.    ** p->a
6210: 41 6c 6c 6f 63 5b 5d 2e 20 20 2a 2f 0a 20 20 20  Alloc[].  */.   
6220: 20 6d 65 6d 63 70 79 28 70 2d 3e 61 41 6c 6c 6f   memcpy(p->aAllo
6230: 63 2c 20 26 70 2d 3e 61 42 75 66 66 65 72 5b 69  c, &p->aBuffer[i
6240: 42 75 66 5d 2c 20 6e 41 76 61 69 6c 29 3b 0a 20  Buf], nAvail);. 
6250: 20 20 20 70 2d 3e 69 52 65 61 64 4f 66 66 20 2b     p->iReadOff +
6260: 3d 20 6e 41 76 61 69 6c 3b 0a 20 20 20 20 6e 52  = nAvail;.    nR
6270: 65 6d 20 3d 20 6e 42 79 74 65 20 2d 20 6e 41 76  em = nByte - nAv
6280: 61 69 6c 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ail;..    /* The
6290: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20   following loop 
62a0: 63 6f 70 69 65 73 20 75 70 20 74 6f 20 70 2d 3e  copies up to p->
62b0: 6e 42 75 66 66 65 72 20 62 79 74 65 73 20 70 65  nBuffer bytes pe
62c0: 72 20 69 74 65 72 61 74 69 6f 6e 20 69 6e 74 6f  r iteration into
62d0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 2d 3e 61  .    ** the p->a
62e0: 41 6c 6c 6f 63 5b 5d 20 62 75 66 66 65 72 2e 20  Alloc[] buffer. 
62f0: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 6e   */.    while( n
6300: 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Rem>0 ){.      i
6310: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76 64             /* vd
6330: 62 65 50 6d 61 52 65 61 64 42 6c 6f 62 28 29 20  bePmaReadBlob() 
6340: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
6350: 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 20       int nCopy; 
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6370: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
6380: 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
6390: 20 20 20 20 20 75 38 20 2a 61 4e 65 78 74 3b 20       u8 *aNext; 
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63b0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
63c0: 75 66 66 65 72 20 74 6f 20 63 6f 70 79 20 64 61  uffer to copy da
63d0: 74 61 20 66 72 6f 6d 20 2a 2f 0a 0a 20 20 20 20  ta from */..    
63e0: 20 20 6e 43 6f 70 79 20 3d 20 6e 52 65 6d 3b 0a    nCopy = nRem;.
63f0: 20 20 20 20 20 20 69 66 28 20 6e 52 65 6d 3e 70        if( nRem>p
6400: 2d 3e 6e 42 75 66 66 65 72 20 29 20 6e 43 6f 70  ->nBuffer ) nCop
6410: 79 20 3d 20 70 2d 3e 6e 42 75 66 66 65 72 3b 0a  y = p->nBuffer;.
6420: 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 50        rc = vdbeP
6430: 6d 61 52 65 61 64 42 6c 6f 62 28 70 2c 20 6e 43  maReadBlob(p, nC
6440: 6f 70 79 2c 20 26 61 4e 65 78 74 29 3b 0a 20 20  opy, &aNext);.  
6450: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6460: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
6470: 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
6480: 20 61 4e 65 78 74 21 3d 70 2d 3e 61 41 6c 6c 6f   aNext!=p->aAllo
6490: 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
64a0: 79 28 26 70 2d 3e 61 41 6c 6c 6f 63 5b 6e 42 79  y(&p->aAlloc[nBy
64b0: 74 65 20 2d 20 6e 52 65 6d 5d 2c 20 61 4e 65 78  te - nRem], aNex
64c0: 74 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  t, nCopy);.     
64d0: 20 6e 52 65 6d 20 2d 3d 20 6e 43 6f 70 79 3b 0a   nRem -= nCopy;.
64e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2a 70 70 4f 75      }..    *ppOu
64f0: 74 20 3d 20 70 2d 3e 61 41 6c 6c 6f 63 3b 0a 20  t = p->aAlloc;. 
6500: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
6510: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6520: 20 52 65 61 64 20 61 20 76 61 72 69 6e 74 20 66   Read a varint f
6530: 72 6f 6d 20 74 68 65 20 73 74 72 65 61 6d 20 6f  rom the stream o
6540: 66 20 64 61 74 61 20 61 63 63 65 73 73 65 64 20  f data accessed 
6550: 62 79 20 70 2e 20 53 65 74 20 2a 70 6e 4f 75 74  by p. Set *pnOut
6560: 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   to.** the value
6570: 20 72 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63   read..*/.static
6580: 20 69 6e 74 20 76 64 62 65 50 6d 61 52 65 61 64   int vdbePmaRead
6590: 56 61 72 69 6e 74 28 50 6d 61 52 65 61 64 65 72  Varint(PmaReader
65a0: 20 2a 70 2c 20 75 36 34 20 2a 70 6e 4f 75 74 29   *p, u64 *pnOut)
65b0: 7b 0a 20 20 69 6e 74 20 69 42 75 66 3b 0a 0a 20  {.  int iBuf;.. 
65c0: 20 69 66 28 20 70 2d 3e 61 4d 61 70 20 29 7b 0a   if( p->aMap ){.
65d0: 20 20 20 20 70 2d 3e 69 52 65 61 64 4f 66 66 20      p->iReadOff 
65e0: 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  += sqlite3GetVar
65f0: 69 6e 74 28 26 70 2d 3e 61 4d 61 70 5b 70 2d 3e  int(&p->aMap[p->
6600: 69 52 65 61 64 4f 66 66 5d 2c 20 70 6e 4f 75 74  iReadOff], pnOut
6610: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6620: 69 42 75 66 20 3d 20 70 2d 3e 69 52 65 61 64 4f  iBuf = p->iReadO
6630: 66 66 20 25 20 70 2d 3e 6e 42 75 66 66 65 72 3b  ff % p->nBuffer;
6640: 0a 20 20 20 20 69 66 28 20 69 42 75 66 20 26 26  .    if( iBuf &&
6650: 20 28 70 2d 3e 6e 42 75 66 66 65 72 2d 69 42 75   (p->nBuffer-iBu
6660: 66 29 3e 3d 39 20 29 7b 0a 20 20 20 20 20 20 70  f)>=9 ){.      p
6670: 2d 3e 69 52 65 61 64 4f 66 66 20 2b 3d 20 73 71  ->iReadOff += sq
6680: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26  lite3GetVarint(&
6690: 70 2d 3e 61 42 75 66 66 65 72 5b 69 42 75 66 5d  p->aBuffer[iBuf]
66a0: 2c 20 70 6e 4f 75 74 29 3b 0a 20 20 20 20 7d 65  , pnOut);.    }e
66b0: 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 61 56  lse{.      u8 aV
66c0: 61 72 69 6e 74 5b 31 36 5d 2c 20 2a 61 3b 0a 20  arint[16], *a;. 
66d0: 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30 2c 20       int i = 0, 
66e0: 72 63 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  rc;.      do{.  
66f0: 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 50        rc = vdbeP
6700: 6d 61 52 65 61 64 42 6c 6f 62 28 70 2c 20 31 2c  maReadBlob(p, 1,
6710: 20 26 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66   &a);.        if
6720: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
6730: 3b 0a 20 20 20 20 20 20 20 20 61 56 61 72 69 6e  ;.        aVarin
6740: 74 5b 28 69 2b 2b 29 26 30 78 66 5d 20 3d 20 61  t[(i++)&0xf] = a
6750: 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  [0];.      }whil
6760: 65 28 20 28 61 5b 30 5d 26 30 78 38 30 29 21 3d  e( (a[0]&0x80)!=
6770: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
6780: 65 33 47 65 74 56 61 72 69 6e 74 28 61 56 61 72  e3GetVarint(aVar
6790: 69 6e 74 2c 20 70 6e 4f 75 74 29 3b 0a 20 20 20  int, pnOut);.   
67a0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
67b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
67c0: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
67d0: 6d 65 6d 6f 72 79 20 6d 61 70 20 66 69 6c 65 20  memory map file 
67e0: 70 46 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73  pFile. If succes
67f0: 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f  sful, set *pp to
6800: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
6810: 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 61 6e 64   new mapping and
6820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6830: 4b 2e 20 49 66 20 74 68 65 20 6d 61 70 70 69 6e  K. If the mappin
6840: 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
6850: 65 64 20 0a 2a 2a 20 28 62 65 63 61 75 73 65 20  ed .** (because 
6860: 74 68 65 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  the file is too 
6870: 6c 61 72 67 65 20 6f 72 20 74 68 65 20 56 46 53  large or the VFS
6880: 20 6c 61 79 65 72 20 69 73 20 63 6f 6e 66 69 67   layer is config
6890: 75 72 65 64 20 6e 6f 74 20 74 6f 20 75 73 65 0a  ured not to use.
68a0: 2a 2a 20 6d 6d 61 70 29 2c 20 72 65 74 75 72 6e  ** mmap), return
68b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 73   SQLITE_OK and s
68c0: 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a  et *pp to NULL..
68d0: 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e 20  **.** Or, if an 
68e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
68f0: 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
6900: 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66  rror code. The f
6910: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  inal value of.**
6920: 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65   *pp is undefine
6930: 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
6940: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
6950: 62 65 53 6f 72 74 65 72 4d 61 70 46 69 6c 65 28  beSorterMapFile(
6960: 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61  SortSubtask *pTa
6970: 73 6b 2c 20 53 6f 72 74 65 72 46 69 6c 65 20 2a  sk, SorterFile *
6980: 70 46 69 6c 65 2c 20 75 38 20 2a 2a 70 70 29 7b  pFile, u8 **pp){
6990: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
69a0: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 46 69  TE_OK;.  if( pFi
69b0: 6c 65 2d 3e 69 45 6f 66 3c 3d 28 69 36 34 29 28  le->iEof<=(i64)(
69c0: 70 54 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e  pTask->pSorter->
69d0: 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d  db->nMaxSorterMm
69e0: 61 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ap) ){.    sqlit
69f0: 65 33 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20 70  e3_file *pFd = p
6a00: 46 69 6c 65 2d 3e 70 46 64 3b 0a 20 20 20 20 69  File->pFd;.    i
6a10: 66 28 20 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73  f( pFd->pMethods
6a20: 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b  ->iVersion>=3 ){
6a30: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6a40: 74 65 33 4f 73 46 65 74 63 68 28 70 46 64 2c 20  te3OsFetch(pFd, 
6a50: 30 2c 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 69  0, (int)pFile->i
6a60: 45 6f 66 2c 20 28 76 6f 69 64 2a 2a 29 70 70 29  Eof, (void**)pp)
6a70: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6a80: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6a90: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
6aa0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6ab0: 2a 2a 20 41 74 74 61 63 68 20 50 6d 61 52 65 61  ** Attach PmaRea
6ac0: 64 65 72 20 70 52 65 61 64 72 20 74 6f 20 66 69  der pReadr to fi
6ad0: 6c 65 20 70 46 69 6c 65 20 28 69 66 20 69 74 20  le pFile (if it 
6ae0: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
6af0: 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68  ttached to.** th
6b00: 61 74 20 66 69 6c 65 29 20 61 6e 64 20 73 65 65  at file) and see
6b10: 6b 20 69 74 20 74 6f 20 6f 66 66 73 65 74 20 69  k it to offset i
6b20: 4f 66 66 20 77 69 74 68 69 6e 20 74 68 65 20 66  Off within the f
6b30: 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
6b40: 49 54 45 5f 4f 4b 20 0a 2a 2a 20 69 66 20 73 75  ITE_OK .** if su
6b50: 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
6b60: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
6b70: 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  e if an error oc
6b80: 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
6b90: 69 6e 74 20 76 64 62 65 50 6d 61 52 65 61 64 65  int vdbePmaReade
6ba0: 72 53 65 65 6b 28 0a 20 20 53 6f 72 74 53 75 62  rSeek(.  SortSub
6bb0: 74 61 73 6b 20 2a 70 54 61 73 6b 2c 20 20 20 20  task *pTask,    
6bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 73 6b           /* Task
6bd0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 6d   context */.  Pm
6be0: 61 52 65 61 64 65 72 20 2a 70 52 65 61 64 72 2c  aReader *pReadr,
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6c00: 20 52 65 61 64 65 72 20 77 68 6f 73 65 20 63 75   Reader whose cu
6c10: 72 73 6f 72 20 69 73 20 74 6f 20 62 65 20 6d 6f  rsor is to be mo
6c20: 76 65 64 20 2a 2f 0a 20 20 53 6f 72 74 65 72 46  ved */.  SorterF
6c30: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
6c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74           /* Sort
6c50: 65 72 20 66 69 6c 65 20 74 6f 20 72 65 61 64 20  er file to read 
6c60: 66 72 6f 6d 20 2a 2f 0a 20 20 69 36 34 20 69 4f  from */.  i64 iO
6c70: 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ff              
6c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
6c90: 73 65 74 20 69 6e 20 70 46 69 6c 65 20 2a 2f 0a  set in pFile */.
6ca0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
6cb0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
6cc0: 72 74 28 20 70 52 65 61 64 72 2d 3e 70 49 6e 63  rt( pReadr->pInc
6cd0: 72 3d 3d 30 20 7c 7c 20 70 52 65 61 64 72 2d 3e  r==0 || pReadr->
6ce0: 70 49 6e 63 72 2d 3e 62 45 6f 66 3d 3d 30 20 29  pIncr->bEof==0 )
6cf0: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
6d00: 46 61 75 6c 74 53 69 6d 28 32 30 31 29 20 29 20  FaultSim(201) ) 
6d10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
6d20: 45 52 52 5f 52 45 41 44 3b 0a 20 20 69 66 28 20  ERR_READ;.  if( 
6d30: 70 52 65 61 64 72 2d 3e 61 4d 61 70 20 29 7b 0a  pReadr->aMap ){.
6d40: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
6d50: 65 74 63 68 28 70 52 65 61 64 72 2d 3e 70 46 64  etch(pReadr->pFd
6d60: 2c 20 30 2c 20 70 52 65 61 64 72 2d 3e 61 4d 61  , 0, pReadr->aMa
6d70: 70 29 3b 0a 20 20 20 20 70 52 65 61 64 72 2d 3e  p);.    pReadr->
6d80: 61 4d 61 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  aMap = 0;.  }.  
6d90: 70 52 65 61 64 72 2d 3e 69 52 65 61 64 4f 66 66  pReadr->iReadOff
6da0: 20 3d 20 69 4f 66 66 3b 0a 20 20 70 52 65 61 64   = iOff;.  pRead
6db0: 72 2d 3e 69 45 6f 66 20 3d 20 70 46 69 6c 65 2d  r->iEof = pFile-
6dc0: 3e 69 45 6f 66 3b 0a 20 20 70 52 65 61 64 72 2d  >iEof;.  pReadr-
6dd0: 3e 70 46 64 20 3d 20 70 46 69 6c 65 2d 3e 70 46  >pFd = pFile->pF
6de0: 64 3b 0a 0a 20 20 72 63 20 3d 20 76 64 62 65 53  d;..  rc = vdbeS
6df0: 6f 72 74 65 72 4d 61 70 46 69 6c 65 28 70 54 61  orterMapFile(pTa
6e00: 73 6b 2c 20 70 46 69 6c 65 2c 20 26 70 52 65 61  sk, pFile, &pRea
6e10: 64 72 2d 3e 61 4d 61 70 29 3b 0a 20 20 69 66 28  dr->aMap);.  if(
6e20: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6e30: 26 20 70 52 65 61 64 72 2d 3e 61 4d 61 70 3d 3d  & pReadr->aMap==
6e40: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 67 73  0 ){.    int pgs
6e50: 7a 20 3d 20 70 54 61 73 6b 2d 3e 70 53 6f 72 74  z = pTask->pSort
6e60: 65 72 2d 3e 70 67 73 7a 3b 0a 20 20 20 20 69 6e  er->pgsz;.    in
6e70: 74 20 69 42 75 66 20 3d 20 70 52 65 61 64 72 2d  t iBuf = pReadr-
6e80: 3e 69 52 65 61 64 4f 66 66 20 25 20 70 67 73 7a  >iReadOff % pgsz
6e90: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 61 64 72  ;.    if( pReadr
6ea0: 2d 3e 61 42 75 66 66 65 72 3d 3d 30 20 29 7b 0a  ->aBuffer==0 ){.
6eb0: 20 20 20 20 20 20 70 52 65 61 64 72 2d 3e 61 42        pReadr->aB
6ec0: 75 66 66 65 72 20 3d 20 28 75 38 2a 29 73 71 6c  uffer = (u8*)sql
6ed0: 69 74 65 33 4d 61 6c 6c 6f 63 28 70 67 73 7a 29  ite3Malloc(pgsz)
6ee0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 61  ;.      if( pRea
6ef0: 64 72 2d 3e 61 42 75 66 66 65 72 3d 3d 30 20 29  dr->aBuffer==0 )
6f00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
6f10: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 70  EM_BKPT;.      p
6f20: 52 65 61 64 72 2d 3e 6e 42 75 66 66 65 72 20 3d  Readr->nBuffer =
6f30: 20 70 67 73 7a 3b 0a 20 20 20 20 7d 0a 20 20 20   pgsz;.    }.   
6f40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6f50: 4f 4b 20 26 26 20 69 42 75 66 20 29 7b 0a 20 20  OK && iBuf ){.  
6f60: 20 20 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20      int nRead = 
6f70: 70 67 73 7a 20 2d 20 69 42 75 66 3b 0a 20 20 20  pgsz - iBuf;.   
6f80: 20 20 20 69 66 28 20 28 70 52 65 61 64 72 2d 3e     if( (pReadr->
6f90: 69 52 65 61 64 4f 66 66 20 2b 20 6e 52 65 61 64  iReadOff + nRead
6fa0: 29 20 3e 20 70 52 65 61 64 72 2d 3e 69 45 6f 66  ) > pReadr->iEof
6fb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 52 65 61   ){.        nRea
6fc0: 64 20 3d 20 28 69 6e 74 29 28 70 52 65 61 64 72  d = (int)(pReadr
6fd0: 2d 3e 69 45 6f 66 20 2d 20 70 52 65 61 64 72 2d  ->iEof - pReadr-
6fe0: 3e 69 52 65 61 64 4f 66 66 29 3b 0a 20 20 20 20  >iReadOff);.    
6ff0: 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
7000: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 0a 20 20  qlite3OsRead(.  
7010: 20 20 20 20 20 20 20 20 70 52 65 61 64 72 2d 3e          pReadr->
7020: 70 46 64 2c 20 26 70 52 65 61 64 72 2d 3e 61 42  pFd, &pReadr->aB
7030: 75 66 66 65 72 5b 69 42 75 66 5d 2c 20 6e 52 65  uffer[iBuf], nRe
7040: 61 64 2c 20 70 52 65 61 64 72 2d 3e 69 52 65 61  ad, pReadr->iRea
7050: 64 4f 66 66 0a 20 20 20 20 20 20 29 3b 0a 20 20  dOff.      );.  
7060: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
7070: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
7080: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
7090: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
70a0: 41 64 76 61 6e 63 65 20 50 6d 61 52 65 61 64 65  Advance PmaReade
70b0: 72 20 70 52 65 61 64 72 20 74 6f 20 74 68 65 20  r pReadr to the 
70c0: 6e 65 78 74 20 6b 65 79 20 69 6e 20 69 74 73 20  next key in its 
70d0: 50 4d 41 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  PMA. Return SQLI
70e0: 54 45 5f 4f 4b 20 69 66 0a 2a 2a 20 6e 6f 20 65  TE_OK if.** no e
70f0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20  rror occurs, or 
7100: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
7110: 63 6f 64 65 20 69 66 20 6f 6e 65 20 64 6f 65 73  code if one does
7120: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7130: 76 64 62 65 50 6d 61 52 65 61 64 65 72 4e 65 78  vdbePmaReaderNex
7140: 74 28 50 6d 61 52 65 61 64 65 72 20 2a 70 52 65  t(PmaReader *pRe
7150: 61 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  adr){.  int rc =
7160: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
7170: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
7180: 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 75 36 34 20  n Code */.  u64 
7190: 6e 52 65 63 20 3d 20 30 3b 20 20 20 20 20 20 20  nRec = 0;       
71a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
71b0: 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 69 6e  ize of record in
71c0: 20 62 79 74 65 73 20 2a 2f 0a 0a 0a 20 20 69 66   bytes */...  if
71d0: 28 20 70 52 65 61 64 72 2d 3e 69 52 65 61 64 4f  ( pReadr->iReadO
71e0: 66 66 3e 3d 70 52 65 61 64 72 2d 3e 69 45 6f 66  ff>=pReadr->iEof
71f0: 20 29 7b 0a 20 20 20 20 49 6e 63 72 4d 65 72 67   ){.    IncrMerg
7200: 65 72 20 2a 70 49 6e 63 72 20 3d 20 70 52 65 61  er *pIncr = pRea
7210: 64 72 2d 3e 70 49 6e 63 72 3b 0a 20 20 20 20 69  dr->pIncr;.    i
7220: 6e 74 20 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20  nt bEof = 1;.   
7230: 20 69 66 28 20 70 49 6e 63 72 20 29 7b 0a 20 20   if( pIncr ){.  
7240: 20 20 20 20 72 63 20 3d 20 76 64 62 65 49 6e 63      rc = vdbeInc
7250: 72 53 77 61 70 28 70 49 6e 63 72 29 3b 0a 20 20  rSwap(pIncr);.  
7260: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
7270: 54 45 5f 4f 4b 20 26 26 20 70 49 6e 63 72 2d 3e  TE_OK && pIncr->
7280: 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  bEof==0 ){.     
7290: 20 20 20 72 63 20 3d 20 76 64 62 65 50 6d 61 52     rc = vdbePmaR
72a0: 65 61 64 65 72 53 65 65 6b 28 0a 20 20 20 20 20  eaderSeek(.     
72b0: 20 20 20 20 20 20 20 70 49 6e 63 72 2d 3e 70 54         pIncr->pT
72c0: 61 73 6b 2c 20 70 52 65 61 64 72 2c 20 26 70 49  ask, pReadr, &pI
72d0: 6e 63 72 2d 3e 61 46 69 6c 65 5b 30 5d 2c 20 70  ncr->aFile[0], p
72e0: 49 6e 63 72 2d 3e 69 53 74 61 72 74 4f 66 66 0a  Incr->iStartOff.
72f0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
7300: 20 20 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20     bEof = 0;.   
7310: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
7320: 69 66 28 20 62 45 6f 66 20 29 7b 0a 20 20 20 20  if( bEof ){.    
7330: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20    /* This is an 
7340: 45 4f 46 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f  EOF condition */
7350: 0a 20 20 20 20 20 20 76 64 62 65 50 6d 61 52 65  .      vdbePmaRe
7360: 61 64 65 72 43 6c 65 61 72 28 70 52 65 61 64 72  aderClear(pReadr
7370: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7380: 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
7390: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
73a0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
73b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
73c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
73d0: 76 64 62 65 50 6d 61 52 65 61 64 56 61 72 69 6e  vdbePmaReadVarin
73e0: 74 28 70 52 65 61 64 72 2c 20 26 6e 52 65 63 29  t(pReadr, &nRec)
73f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
7400: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7410: 20 70 52 65 61 64 72 2d 3e 6e 4b 65 79 20 3d 20   pReadr->nKey = 
7420: 28 69 6e 74 29 6e 52 65 63 3b 0a 20 20 20 20 72  (int)nRec;.    r
7430: 63 20 3d 20 76 64 62 65 50 6d 61 52 65 61 64 42  c = vdbePmaReadB
7440: 6c 6f 62 28 70 52 65 61 64 72 2c 20 28 69 6e 74  lob(pReadr, (int
7450: 29 6e 52 65 63 2c 20 26 70 52 65 61 64 72 2d 3e  )nRec, &pReadr->
7460: 61 4b 65 79 29 3b 0a 20 20 20 20 74 65 73 74 63  aKey);.    testc
7470: 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
7480: 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  OK );.  }..  ret
7490: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
74a0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 50 6d 61 52   Initialize PmaR
74b0: 65 61 64 65 72 20 70 52 65 61 64 72 20 74 6f 20  eader pReadr to 
74c0: 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  scan through the
74d0: 20 50 4d 41 20 73 74 6f 72 65 64 20 69 6e 20 66   PMA stored in f
74e0: 69 6c 65 20 70 46 69 6c 65 0a 2a 2a 20 73 74 61  ile pFile.** sta
74f0: 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 20  rting at offset 
7500: 69 53 74 61 72 74 20 61 6e 64 20 65 6e 64 69 6e  iStart and endin
7510: 67 20 61 74 20 6f 66 66 73 65 74 20 69 45 6f 66  g at offset iEof
7520: 2d 31 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  -1. This functio
7530: 6e 20 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68 65  n .** leaves the
7540: 20 50 6d 61 52 65 61 64 65 72 20 70 6f 69 6e 74   PmaReader point
7550: 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
7560: 20 6b 65 79 20 69 6e 20 74 68 65 20 50 4d 41 20   key in the PMA 
7570: 28 6f 72 20 45 4f 46 20 69 66 20 74 68 65 20 0a  (or EOF if the .
7580: 2a 2a 20 50 4d 41 20 69 73 20 65 6d 70 74 79 29  ** PMA is empty)
7590: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
75a0: 6e 42 79 74 65 20 70 61 72 61 6d 65 74 65 72 20  nByte parameter 
75b0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  is NULL, then it
75c0: 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
75d0: 20 74 68 65 20 66 69 6c 65 20 0a 2a 2a 20 63 6f   the file .** co
75e0: 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20  ntains a single 
75f0: 50 4d 41 2c 20 61 6e 64 20 74 68 61 74 20 74 68  PMA, and that th
7600: 61 74 20 50 4d 41 20 6f 6d 69 74 73 20 74 68 65  at PMA omits the
7610: 20 69 6e 69 74 69 61 6c 20 6c 65 6e 67 74 68 20   initial length 
7620: 76 61 72 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  varint..*/.stati
7630: 63 20 69 6e 74 20 76 64 62 65 50 6d 61 52 65 61  c int vdbePmaRea
7640: 64 65 72 49 6e 69 74 28 0a 20 20 53 6f 72 74 53  derInit(.  SortS
7650: 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c 20 20  ubtask *pTask,  
7660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
7670: 73 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  sk context */.  
7680: 53 6f 72 74 65 72 46 69 6c 65 20 2a 70 46 69 6c  SorterFile *pFil
7690: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
76a0: 2f 2a 20 53 6f 72 74 65 72 20 66 69 6c 65 20 74  /* Sorter file t
76b0: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
76c0: 20 69 36 34 20 69 53 74 61 72 74 2c 20 20 20 20   i64 iStart,    
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 2f 2a 20 53 74 61 72 74 20 6f 66 66 73 65 74   /* Start offset
76f0: 20 69 6e 20 70 46 69 6c 65 20 2a 2f 0a 20 20 50   in pFile */.  P
7700: 6d 61 52 65 61 64 65 72 20 2a 70 52 65 61 64 72  maReader *pReadr
7710: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7720: 2a 20 50 6d 61 52 65 61 64 65 72 20 74 6f 20 70  * PmaReader to p
7730: 6f 70 75 6c 61 74 65 20 2a 2f 0a 20 20 69 36 34  opulate */.  i64
7740: 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20 20   *pnByte        
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7760: 49 4e 2f 4f 55 54 3a 20 49 6e 63 72 65 6d 65 6e  IN/OUT: Incremen
7770: 74 20 74 68 69 73 20 76 61 6c 75 65 20 62 79 20  t this value by 
7780: 50 4d 41 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20  PMA size */.){. 
7790: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
77a0: 72 74 28 20 70 46 69 6c 65 2d 3e 69 45 6f 66 3e  rt( pFile->iEof>
77b0: 69 53 74 61 72 74 20 29 3b 0a 20 20 61 73 73 65  iStart );.  asse
77c0: 72 74 28 20 70 52 65 61 64 72 2d 3e 61 41 6c 6c  rt( pReadr->aAll
77d0: 6f 63 3d 3d 30 20 26 26 20 70 52 65 61 64 72 2d  oc==0 && pReadr-
77e0: 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  >nAlloc==0 );.  
77f0: 61 73 73 65 72 74 28 20 70 52 65 61 64 72 2d 3e  assert( pReadr->
7800: 61 42 75 66 66 65 72 3d 3d 30 20 29 3b 0a 20 20  aBuffer==0 );.  
7810: 61 73 73 65 72 74 28 20 70 52 65 61 64 72 2d 3e  assert( pReadr->
7820: 61 4d 61 70 3d 3d 30 20 29 3b 0a 0a 20 20 72 63  aMap==0 );..  rc
7830: 20 3d 20 76 64 62 65 50 6d 61 52 65 61 64 65 72   = vdbePmaReader
7840: 53 65 65 6b 28 70 54 61 73 6b 2c 20 70 52 65 61  Seek(pTask, pRea
7850: 64 72 2c 20 70 46 69 6c 65 2c 20 69 53 74 61 72  dr, pFile, iStar
7860: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
7870: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
7880: 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 20 20 20  64 nByte = 0;   
7890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
78a0: 20 53 69 7a 65 20 6f 66 20 50 4d 41 20 69 6e 20   Size of PMA in 
78b0: 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 72 63 20  bytes */.    rc 
78c0: 3d 20 76 64 62 65 50 6d 61 52 65 61 64 56 61 72  = vdbePmaReadVar
78d0: 69 6e 74 28 70 52 65 61 64 72 2c 20 26 6e 42 79  int(pReadr, &nBy
78e0: 74 65 29 3b 0a 20 20 20 20 70 52 65 61 64 72 2d  te);.    pReadr-
78f0: 3e 69 45 6f 66 20 3d 20 70 52 65 61 64 72 2d 3e  >iEof = pReadr->
7900: 69 52 65 61 64 4f 66 66 20 2b 20 6e 42 79 74 65  iReadOff + nByte
7910: 3b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d  ;.    *pnByte +=
7920: 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 0a 20 20 69   nByte;.  }..  i
7930: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7940: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 76 64 62   ){.    rc = vdb
7950: 65 50 6d 61 52 65 61 64 65 72 4e 65 78 74 28 70  ePmaReaderNext(p
7960: 52 65 61 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Readr);.  }.  re
7970: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7980: 2a 20 41 20 76 65 72 73 69 6f 6e 20 6f 66 20 76  * A version of v
7990: 64 62 65 53 6f 72 74 65 72 43 6f 6d 70 61 72 65  dbeSorterCompare
79a0: 28 29 20 74 68 61 74 20 61 73 73 75 6d 65 73 20  () that assumes 
79b0: 74 68 61 74 20 69 74 20 68 61 73 20 61 6c 72 65  that it has alre
79c0: 61 64 79 20 62 65 65 6e 0a 2a 2a 20 64 65 74 65  ady been.** dete
79d0: 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20  rmined that the 
79e0: 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 6b  first field of k
79f0: 65 79 31 20 69 73 20 65 71 75 61 6c 20 74 6f 20  ey1 is equal to 
7a00: 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
7a10: 6f 66 20 0a 2a 2a 20 6b 65 79 32 2e 0a 2a 2f 0a  of .** key2..*/.
7a20: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 53  static int vdbeS
7a30: 6f 72 74 65 72 43 6f 6d 70 61 72 65 54 61 69 6c  orterCompareTail
7a40: 28 0a 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20  (.  SortSubtask 
7a50: 2a 70 54 61 73 6b 2c 20 20 20 20 20 20 20 20 20  *pTask,         
7a60: 20 20 20 20 2f 2a 20 53 75 62 74 61 73 6b 20 63      /* Subtask c
7a70: 6f 6e 74 65 78 74 20 28 66 6f 72 20 70 4b 65 79  ontext (for pKey
7a80: 49 6e 66 6f 29 20 2a 2f 0a 20 20 69 6e 74 20 2a  Info) */.  int *
7a90: 70 62 4b 65 79 32 43 61 63 68 65 64 2c 20 20 20  pbKey2Cached,   
7aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
7ab0: 75 65 20 69 66 20 70 54 61 73 6b 2d 3e 70 55 6e  ue if pTask->pUn
7ac0: 70 61 63 6b 65 64 20 69 73 20 70 4b 65 79 32 20  packed is pKey2 
7ad0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
7ae0: 2a 70 4b 65 79 31 2c 20 69 6e 74 20 6e 4b 65 79  *pKey1, int nKey
7af0: 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 73 69 64  1,   /* Left sid
7b00: 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  e of comparison 
7b10: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
7b20: 2a 70 4b 65 79 32 2c 20 69 6e 74 20 6e 4b 65 79  *pKey2, int nKey
7b30: 32 20 20 20 20 2f 2a 20 52 69 67 68 74 20 73 69  2    /* Right si
7b40: 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  de of comparison
7b50: 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65   */.){.  Unpacke
7b60: 64 52 65 63 6f 72 64 20 2a 72 32 20 3d 20 70 54  dRecord *r2 = pT
7b70: 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 3b 0a  ask->pUnpacked;.
7b80: 20 20 69 66 28 20 2a 70 62 4b 65 79 32 43 61 63    if( *pbKey2Cac
7b90: 68 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  hed==0 ){.    sq
7ba0: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
7bb0: 6e 70 61 63 6b 28 70 54 61 73 6b 2d 3e 70 53 6f  npack(pTask->pSo
7bc0: 72 74 65 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  rter->pKeyInfo, 
7bd0: 6e 4b 65 79 32 2c 20 70 4b 65 79 32 2c 20 72 32  nKey2, pKey2, r2
7be0: 29 3b 0a 20 20 20 20 2a 70 62 4b 65 79 32 43 61  );.    *pbKey2Ca
7bf0: 63 68 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  ched = 1;.  }.  
7c00: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
7c10: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
7c20: 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
7c30: 4b 65 79 31 2c 20 72 32 2c 20 31 29 3b 0a 7d 0a  Key1, r2, 1);.}.
7c40: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 6b  ./*.** Compare k
7c50: 65 79 31 20 28 62 75 66 66 65 72 20 70 4b 65 79  ey1 (buffer pKey
7c60: 31 2c 20 73 69 7a 65 20 6e 4b 65 79 31 20 62 79  1, size nKey1 by
7c70: 74 65 73 29 20 77 69 74 68 20 6b 65 79 32 20 28  tes) with key2 (
7c80: 62 75 66 66 65 72 20 70 4b 65 79 32 2c 20 0a 2a  buffer pKey2, .*
7c90: 2a 20 73 69 7a 65 20 6e 4b 65 79 32 20 62 79 74  * size nKey2 byt
7ca0: 65 73 29 2e 20 55 73 65 20 28 70 54 61 73 6b 2d  es). Use (pTask-
7cb0: 3e 70 4b 65 79 49 6e 66 6f 29 20 66 6f 72 20 74  >pKeyInfo) for t
7cc0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
7cd0: 75 65 6e 63 65 73 0a 2a 2a 20 75 73 65 64 20 62  uences.** used b
7ce0: 79 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  y the comparison
7cf0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73  . Return the res
7d00: 75 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  ult of the compa
7d10: 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rison..**.** If 
7d20: 49 4e 2f 4f 55 54 20 70 61 72 61 6d 65 74 65 72  IN/OUT parameter
7d30: 20 2a 70 62 4b 65 79 32 43 61 63 68 65 64 20 69   *pbKey2Cached i
7d40: 73 20 74 72 75 65 20 77 68 65 6e 20 74 68 69 73  s true when this
7d50: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
7d60: 6c 65 64 2c 0a 2a 2a 20 69 74 20 69 73 20 61 73  led,.** it is as
7d70: 73 75 6d 65 64 20 74 68 61 74 20 28 70 54 61 73  sumed that (pTas
7d80: 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 29 20 63 6f  k->pUnpacked) co
7d90: 6e 74 61 69 6e 73 20 74 68 65 20 75 6e 70 61 63  ntains the unpac
7da0: 6b 65 64 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f  ked version.** o
7db0: 66 20 6b 65 79 32 2e 20 49 66 20 69 74 20 69 73  f key2. If it is
7dc0: 20 66 61 6c 73 65 2c 20 28 70 54 61 73 6b 2d 3e   false, (pTask->
7dd0: 70 55 6e 70 61 63 6b 65 64 29 20 69 73 20 70 6f  pUnpacked) is po
7de0: 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
7df0: 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 76 65 72   unpacked.** ver
7e00: 73 69 6f 6e 20 6f 66 20 6b 65 79 32 20 61 6e 64  sion of key2 and
7e10: 20 2a 70 62 4b 65 79 32 43 61 63 68 65 64 20 73   *pbKey2Cached s
7e20: 65 74 20 74 6f 20 74 72 75 65 20 62 65 66 6f 72  et to true befor
7e30: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
7e40: 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
7e50: 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
7e60: 64 2c 20 28 70 54 61 73 6b 2d 3e 70 55 6e 70 61  d, (pTask->pUnpa
7e70: 63 6b 65 64 2d 3e 65 72 72 6f 72 5f 72 63 29 20  cked->error_rc) 
7e80: 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 53 51 4c  is set.** to SQL
7e90: 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74  ITE_NOMEM..*/.st
7ea0: 61 74 69 63 20 69 6e 74 20 76 64 62 65 53 6f 72  atic int vdbeSor
7eb0: 74 65 72 43 6f 6d 70 61 72 65 28 0a 20 20 53 6f  terCompare(.  So
7ec0: 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b  rtSubtask *pTask
7ed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
7ee0: 20 53 75 62 74 61 73 6b 20 63 6f 6e 74 65 78 74   Subtask context
7ef0: 20 28 66 6f 72 20 70 4b 65 79 49 6e 66 6f 29 20   (for pKeyInfo) 
7f00: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4b 65 79 32  */.  int *pbKey2
7f10: 43 61 63 68 65 64 2c 20 20 20 20 20 20 20 20 20  Cached,         
7f20: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
7f30: 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64  pTask->pUnpacked
7f40: 20 69 73 20 70 4b 65 79 32 20 2a 2f 0a 20 20 63   is pKey2 */.  c
7f50: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
7f60: 2c 20 69 6e 74 20 6e 4b 65 79 31 2c 20 20 20 2f  , int nKey1,   /
7f70: 2a 20 4c 65 66 74 20 73 69 64 65 20 6f 66 20 63  * Left side of c
7f80: 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 63  omparison */.  c
7f90: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
7fa0: 2c 20 69 6e 74 20 6e 4b 65 79 32 20 20 20 20 2f  , int nKey2    /
7fb0: 2a 20 52 69 67 68 74 20 73 69 64 65 20 6f 66 20  * Right side of 
7fc0: 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b  comparison */.){
7fd0: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
7fe0: 64 20 2a 72 32 20 3d 20 70 54 61 73 6b 2d 3e 70  d *r2 = pTask->p
7ff0: 55 6e 70 61 63 6b 65 64 3b 0a 20 20 69 66 28 20  Unpacked;.  if( 
8000: 21 2a 70 62 4b 65 79 32 43 61 63 68 65 64 20 29  !*pbKey2Cached )
8010: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
8020: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 54  eRecordUnpack(pT
8030: 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 70 4b  ask->pSorter->pK
8040: 65 79 49 6e 66 6f 2c 20 6e 4b 65 79 32 2c 20 70  eyInfo, nKey2, p
8050: 4b 65 79 32 2c 20 72 32 29 3b 0a 20 20 20 20 2a  Key2, r2);.    *
8060: 70 62 4b 65 79 32 43 61 63 68 65 64 20 3d 20 31  pbKey2Cached = 1
8070: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
8080: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
8090: 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
80a0: 4b 65 79 31 2c 20 72 32 29 3b 0a 7d 0a 0a 2f 2a  Key1, r2);.}../*
80b0: 0a 2a 2a 20 41 20 73 70 65 63 69 61 6c 6c 79 20  .** A specially 
80c0: 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
80d0: 6e 20 6f 66 20 76 64 62 65 53 6f 72 74 65 72 43  n of vdbeSorterC
80e0: 6f 6d 70 61 72 65 28 29 20 74 68 61 74 20 61 73  ompare() that as
80f0: 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68  sumes that.** th
8100: 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66  e first field of
8110: 20 65 61 63 68 20 6b 65 79 20 69 73 20 61 20 54   each key is a T
8120: 45 58 54 20 76 61 6c 75 65 20 61 6e 64 20 74 68  EXT value and th
8130: 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  at the collation
8140: 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 74 6f 20  .** sequence to 
8150: 63 6f 6d 70 61 72 65 20 74 68 65 6d 20 77 69 74  compare them wit
8160: 68 20 69 73 20 42 49 4e 41 52 59 2e 0a 2a 2f 0a  h is BINARY..*/.
8170: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 53  static int vdbeS
8180: 6f 72 74 65 72 43 6f 6d 70 61 72 65 54 65 78 74  orterCompareText
8190: 28 0a 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20  (.  SortSubtask 
81a0: 2a 70 54 61 73 6b 2c 20 20 20 20 20 20 20 20 20  *pTask,         
81b0: 20 20 20 20 2f 2a 20 53 75 62 74 61 73 6b 20 63      /* Subtask c
81c0: 6f 6e 74 65 78 74 20 28 66 6f 72 20 70 4b 65 79  ontext (for pKey
81d0: 49 6e 66 6f 29 20 2a 2f 0a 20 20 69 6e 74 20 2a  Info) */.  int *
81e0: 70 62 4b 65 79 32 43 61 63 68 65 64 2c 20 20 20  pbKey2Cached,   
81f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
8200: 75 65 20 69 66 20 70 54 61 73 6b 2d 3e 70 55 6e  ue if pTask->pUn
8210: 70 61 63 6b 65 64 20 69 73 20 70 4b 65 79 32 20  packed is pKey2 
8220: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
8230: 2a 70 4b 65 79 31 2c 20 69 6e 74 20 6e 4b 65 79  *pKey1, int nKey
8240: 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 73 69 64  1,   /* Left sid
8250: 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  e of comparison 
8260: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
8270: 2a 70 4b 65 79 32 2c 20 69 6e 74 20 6e 4b 65 79  *pKey2, int nKey
8280: 32 20 20 20 20 2f 2a 20 52 69 67 68 74 20 73 69  2    /* Right si
8290: 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  de of comparison
82a0: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
82b0: 38 20 2a 20 63 6f 6e 73 74 20 70 31 20 3d 20 28  8 * const p1 = (
82c0: 63 6f 6e 73 74 20 75 38 20 2a 20 63 6f 6e 73 74  const u8 * const
82d0: 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20  )pKey1;.  const 
82e0: 75 38 20 2a 20 63 6f 6e 73 74 20 70 32 20 3d 20  u8 * const p2 = 
82f0: 28 63 6f 6e 73 74 20 75 38 20 2a 20 63 6f 6e 73  (const u8 * cons
8300: 74 29 70 4b 65 79 32 3b 0a 20 20 63 6f 6e 73 74  t)pKey2;.  const
8310: 20 75 38 20 2a 20 63 6f 6e 73 74 20 76 31 20 3d   u8 * const v1 =
8320: 20 26 70 31 5b 20 70 31 5b 30 5d 20 5d 3b 20 20   &p1[ p1[0] ];  
8330: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
8340: 61 6c 75 65 20 31 20 2a 2f 0a 20 20 63 6f 6e 73  alue 1 */.  cons
8350: 74 20 75 38 20 2a 20 63 6f 6e 73 74 20 76 32 20  t u8 * const v2 
8360: 3d 20 26 70 32 5b 20 70 32 5b 30 5d 20 5d 3b 20  = &p2[ p2[0] ]; 
8370: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8380: 76 61 6c 75 65 20 32 20 2a 2f 0a 0a 20 20 69 6e  value 2 */..  in
8390: 74 20 6e 31 3b 0a 20 20 69 6e 74 20 6e 32 3b 0a  t n1;.  int n2;.
83a0: 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 67 65    int res;..  ge
83b0: 74 56 61 72 69 6e 74 33 32 28 26 70 31 5b 31 5d  tVarint32(&p1[1]
83c0: 2c 20 6e 31 29 3b 0a 20 20 67 65 74 56 61 72 69  , n1);.  getVari
83d0: 6e 74 33 32 28 26 70 32 5b 31 5d 2c 20 6e 32 29  nt32(&p2[1], n2)
83e0: 3b 0a 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  ;.  res = memcmp
83f0: 28 76 31 2c 20 76 32 2c 20 28 4d 49 4e 28 6e 31  (v1, v2, (MIN(n1
8400: 2c 20 6e 32 29 20 2d 20 31 33 29 2f 32 29 3b 0a  , n2) - 13)/2);.
8410: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
8420: 20 20 20 20 72 65 73 20 3d 20 6e 31 20 2d 20 6e      res = n1 - n
8430: 32 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 65  2;.  }..  if( re
8440: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  s==0 ){.    if( 
8450: 70 54 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e  pTask->pSorter->
8460: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
8470: 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  >1 ){.      res 
8480: 3d 20 76 64 62 65 53 6f 72 74 65 72 43 6f 6d 70  = vdbeSorterComp
8490: 61 72 65 54 61 69 6c 28 0a 20 20 20 20 20 20 20  areTail(.       
84a0: 20 20 20 70 54 61 73 6b 2c 20 70 62 4b 65 79 32     pTask, pbKey2
84b0: 43 61 63 68 65 64 2c 20 70 4b 65 79 31 2c 20 6e  Cached, pKey1, n
84c0: 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 4b 65  Key1, pKey2, nKe
84d0: 79 32 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  y2.      );.    
84e0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
84f0: 66 28 20 70 54 61 73 6b 2d 3e 70 53 6f 72 74 65  f( pTask->pSorte
8500: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  r->pKeyInfo->aSo
8510: 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20  rtOrder[0] ){.  
8520: 20 20 20 20 72 65 73 20 3d 20 72 65 73 20 2a 20      res = res * 
8530: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  -1;.    }.  }.. 
8540: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
8550: 2f 2a 0a 2a 2a 20 41 20 73 70 65 63 69 61 6c 6c  /*.** A speciall
8560: 79 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73  y optimized vers
8570: 69 6f 6e 20 6f 66 20 76 64 62 65 53 6f 72 74 65  ion of vdbeSorte
8580: 72 43 6f 6d 70 61 72 65 28 29 20 74 68 61 74 20  rCompare() that 
8590: 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
85a0: 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
85b0: 6f 66 20 65 61 63 68 20 6b 65 79 20 69 73 20 61  of each key is a
85c0: 6e 20 49 4e 54 45 47 45 52 20 76 61 6c 75 65 2e  n INTEGER value.
85d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
85e0: 64 62 65 53 6f 72 74 65 72 43 6f 6d 70 61 72 65  dbeSorterCompare
85f0: 49 6e 74 28 0a 20 20 53 6f 72 74 53 75 62 74 61  Int(.  SortSubta
8600: 73 6b 20 2a 70 54 61 73 6b 2c 20 20 20 20 20 20  sk *pTask,      
8610: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 61 73         /* Subtas
8620: 6b 20 63 6f 6e 74 65 78 74 20 28 66 6f 72 20 70  k context (for p
8630: 4b 65 79 49 6e 66 6f 29 20 2a 2f 0a 20 20 69 6e  KeyInfo) */.  in
8640: 74 20 2a 70 62 4b 65 79 32 43 61 63 68 65 64 2c  t *pbKey2Cached,
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8660: 20 54 72 75 65 20 69 66 20 70 54 61 73 6b 2d 3e   True if pTask->
8670: 70 55 6e 70 61 63 6b 65 64 20 69 73 20 70 4b 65  pUnpacked is pKe
8680: 79 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  y2 */.  const vo
8690: 69 64 20 2a 70 4b 65 79 31 2c 20 69 6e 74 20 6e  id *pKey1, int n
86a0: 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20  Key1,   /* Left 
86b0: 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  side of comparis
86c0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  on */.  const vo
86d0: 69 64 20 2a 70 4b 65 79 32 2c 20 69 6e 74 20 6e  id *pKey2, int n
86e0: 4b 65 79 32 20 20 20 20 2f 2a 20 52 69 67 68 74  Key2    /* Right
86f0: 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69   side of compari
8700: 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  son */.){.  cons
8710: 74 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 31 20  t u8 * const p1 
8720: 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 20 63 6f  = (const u8 * co
8730: 6e 73 74 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e  nst)pKey1;.  con
8740: 73 74 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 32  st u8 * const p2
8750: 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 20 63   = (const u8 * c
8760: 6f 6e 73 74 29 70 4b 65 79 32 3b 0a 20 20 63 6f  onst)pKey2;.  co
8770: 6e 73 74 20 69 6e 74 20 73 31 20 3d 20 70 31 5b  nst int s1 = p1[
8780: 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  1];             
8790: 20 20 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64      /* Left hand
87a0: 20 73 65 72 69 61 6c 20 74 79 70 65 20 2a 2f 0a   serial type */.
87b0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 32 20 3d    const int s2 =
87c0: 20 70 32 5b 31 5d 3b 20 20 20 20 20 20 20 20 20   p2[1];         
87d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
87e0: 20 68 61 6e 64 20 73 65 72 69 61 6c 20 74 79 70   hand serial typ
87f0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  e */.  const u8 
8800: 2a 20 63 6f 6e 73 74 20 76 31 20 3d 20 26 70 31  * const v1 = &p1
8810: 5b 20 70 31 5b 30 5d 20 5d 3b 20 20 20 2f 2a 20  [ p1[0] ];   /* 
8820: 50 6f 69 6e 74 65 72 20 74 6f 20 76 61 6c 75 65  Pointer to value
8830: 20 31 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38   1 */.  const u8
8840: 20 2a 20 63 6f 6e 73 74 20 76 32 20 3d 20 26 70   * const v2 = &p
8850: 32 5b 20 70 32 5b 30 5d 20 5d 3b 20 20 20 2f 2a  2[ p2[0] ];   /*
8860: 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 61 6c 75   Pointer to valu
8870: 65 20 32 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  e 2 */.  int res
8880: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
88a0: 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
88b0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 73 31  /..  assert( (s1
88c0: 3e 30 20 26 26 20 73 31 3c 37 29 20 7c 7c 20 73  >0 && s1<7) || s
88d0: 31 3d 3d 38 20 7c 7c 20 73 31 3d 3d 39 20 29 3b  1==8 || s1==9 );
88e0: 0a 20 20 61 73 73 65 72 74 28 20 28 73 32 3e 30  .  assert( (s2>0
88f0: 20 26 26 20 73 32 3c 37 29 20 7c 7c 20 73 32 3d   && s2<7) || s2=
8900: 3d 38 20 7c 7c 20 73 32 3d 3d 39 20 29 3b 0a 0a  =8 || s2==9 );..
8910: 20 20 69 66 28 20 73 31 3d 3d 73 32 20 29 7b 0a    if( s1==s2 ){.
8920: 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 76      /* The two v
8930: 61 6c 75 65 73 20 68 61 76 65 20 74 68 65 20 73  alues have the s
8940: 61 6d 65 20 73 69 67 6e 2e 20 43 6f 6d 70 61 72  ame sign. Compar
8950: 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29  e using memcmp()
8960: 2e 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20  . */.    static 
8970: 63 6f 6e 73 74 20 75 38 20 61 4c 65 6e 5b 5d 20  const u8 aLen[] 
8980: 3d 20 7b 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34  = {0, 1, 2, 3, 4
8990: 2c 20 36 2c 20 38 2c 20 30 2c 20 30 2c 20 30 20  , 6, 8, 0, 0, 0 
89a0: 7d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20  };.    const u8 
89b0: 6e 20 3d 20 61 4c 65 6e 5b 73 31 5d 3b 0a 20 20  n = aLen[s1];.  
89c0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 72 65 73    int i;.    res
89d0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
89e0: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
89f0: 20 20 20 20 69 66 28 20 28 72 65 73 20 3d 20 76      if( (res = v
8a00: 31 5b 69 5d 20 2d 20 76 32 5b 69 5d 29 21 3d 30  1[i] - v2[i])!=0
8a10: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
8a20: 28 28 76 31 5b 30 5d 20 5e 20 76 32 5b 30 5d 29  ((v1[0] ^ v2[0])
8a30: 20 26 20 30 78 38 30 29 21 3d 30 20 29 7b 0a 20   & 0x80)!=0 ){. 
8a40: 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 76           res = v
8a50: 31 5b 30 5d 20 26 20 30 78 38 30 20 3f 20 2d 31  1[0] & 0x80 ? -1
8a60: 20 3a 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   : +1;.        }
8a70: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
8a80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8a90: 7d 65 6c 73 65 20 69 66 28 20 73 31 3e 37 20 26  }else if( s1>7 &
8aa0: 26 20 73 32 3e 37 20 29 7b 0a 20 20 20 20 72 65  & s2>7 ){.    re
8ab0: 73 20 3d 20 73 31 20 2d 20 73 32 3b 0a 20 20 7d  s = s1 - s2;.  }
8ac0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 73 32  else{.    if( s2
8ad0: 3e 37 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  >7 ){.      res 
8ae0: 3d 20 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = +1;.    }else 
8af0: 69 66 28 20 73 31 3e 37 20 29 7b 0a 20 20 20 20  if( s1>7 ){.    
8b00: 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20    res = -1;.    
8b10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73  }else{.      res
8b20: 20 3d 20 73 31 20 2d 20 73 32 3b 0a 20 20 20 20   = s1 - s2;.    
8b30: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65  }.    assert( re
8b40: 73 21 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28  s!=0 );..    if(
8b50: 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
8b60: 69 66 28 20 2a 76 31 20 26 20 30 78 38 30 20 29  if( *v1 & 0x80 )
8b70: 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d   res = -1;.    }
8b80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
8b90: 2a 76 32 20 26 20 30 78 38 30 20 29 20 72 65 73  *v2 & 0x80 ) res
8ba0: 20 3d 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d   = +1;.    }.  }
8bb0: 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  ..  if( res==0 )
8bc0: 7b 0a 20 20 20 20 69 66 28 20 70 54 61 73 6b 2d  {.    if( pTask-
8bd0: 3e 70 53 6f 72 74 65 72 2d 3e 70 4b 65 79 49 6e  >pSorter->pKeyIn
8be0: 66 6f 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a  fo->nField>1 ){.
8bf0: 20 20 20 20 20 20 72 65 73 20 3d 20 76 64 62 65        res = vdbe
8c00: 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 54 61 69  SorterCompareTai
8c10: 6c 28 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  l(.          pTa
8c20: 73 6b 2c 20 70 62 4b 65 79 32 43 61 63 68 65 64  sk, pbKey2Cached
8c30: 2c 20 70 4b 65 79 31 2c 20 6e 4b 65 79 31 2c 20  , pKey1, nKey1, 
8c40: 70 4b 65 79 32 2c 20 6e 4b 65 79 32 0a 20 20 20  pKey2, nKey2.   
8c50: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65     );.    }.  }e
8c60: 6c 73 65 20 69 66 28 20 70 54 61 73 6b 2d 3e 70  lse if( pTask->p
8c70: 53 6f 72 74 65 72 2d 3e 70 4b 65 79 49 6e 66 6f  Sorter->pKeyInfo
8c80: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20  ->aSortOrder[0] 
8c90: 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 72 65 73  ){.    res = res
8ca0: 20 2a 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 72 65   * -1;.  }..  re
8cb0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
8cc0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
8cd0: 65 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65  e temporary inde
8ce0: 78 20 63 75 72 73 6f 72 20 6a 75 73 74 20 6f 70  x cursor just op
8cf0: 65 6e 65 64 20 61 73 20 61 20 73 6f 72 74 65 72  ened as a sorter
8d00: 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 55   cursor..**.** U
8d10: 73 75 61 6c 6c 79 2c 20 74 68 65 20 73 6f 72 74  sually, the sort
8d20: 65 72 20 6d 6f 64 75 6c 65 20 75 73 65 73 20 74  er module uses t
8d30: 68 65 20 76 61 6c 75 65 20 6f 66 20 28 70 43 73  he value of (pCs
8d40: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  r->pKeyInfo->nFi
8d50: 65 6c 64 29 0a 2a 2a 20 74 6f 20 64 65 74 65 72  eld).** to deter
8d60: 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mine the number 
8d70: 6f 66 20 66 69 65 6c 64 73 20 74 68 61 74 20 73  of fields that s
8d80: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 61 72 65  hould be compare
8d90: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 65  d from the.** re
8da0: 63 6f 72 64 73 20 62 65 69 6e 67 20 73 6f 72 74  cords being sort
8db0: 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ed. However, if 
8dc0: 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
8dd0: 20 61 73 20 61 72 67 75 6d 65 6e 74 20 6e 46 69   as argument nFi
8de0: 65 6c 64 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  eld.** is non-ze
8df0: 72 6f 20 61 6e 64 20 74 68 65 20 73 6f 72 74 65  ro and the sorte
8e00: 72 20 69 73 20 61 62 6c 65 20 74 6f 20 67 75 61  r is able to gua
8e10: 72 61 6e 74 65 65 20 61 20 73 74 61 62 6c 65 20  rantee a stable 
8e20: 73 6f 72 74 2c 20 6e 46 69 65 6c 64 0a 2a 2a 20  sort, nField.** 
8e30: 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
8e40: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 77 68   This is used wh
8e50: 65 6e 20 73 6f 72 74 69 6e 67 20 72 65 63 6f 72  en sorting recor
8e60: 64 73 20 66 6f 72 20 61 20 43 52 45 41 54 45 20  ds for a CREATE 
8e70: 49 4e 44 45 58 0a 2a 2a 20 73 74 61 74 65 6d 65  INDEX.** stateme
8e80: 6e 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  nt. In this case
8e90: 2c 20 6b 65 79 73 20 61 72 65 20 61 6c 77 61 79  , keys are alway
8ea0: 73 20 64 65 6c 69 76 65 72 65 64 20 74 6f 20 74  s delivered to t
8eb0: 68 65 20 73 6f 72 74 65 72 20 69 6e 0a 2a 2a 20  he sorter in.** 
8ec0: 6f 72 64 65 72 20 6f 66 20 74 68 65 20 70 72 69  order of the pri
8ed0: 6d 61 72 79 20 6b 65 79 2c 20 77 68 69 63 68 20  mary key, which 
8ee0: 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 6d 61  happens to be ma
8ef0: 6b 65 20 75 70 20 74 68 65 20 66 69 6e 61 6c 20  ke up the final 
8f00: 70 61 72 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20  part .** of the 
8f10: 72 65 63 6f 72 64 73 20 62 65 69 6e 67 20 73 6f  records being so
8f20: 72 74 65 64 2e 20 53 6f 20 69 66 20 74 68 65 20  rted. So if the 
8f30: 73 6f 72 74 20 69 73 20 73 74 61 62 6c 65 2c 20  sort is stable, 
8f40: 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 0a 2a  there is never.*
8f50: 2a 20 61 6e 79 20 72 65 61 73 6f 6e 20 74 6f 20  * any reason to 
8f60: 63 6f 6d 70 61 72 65 20 50 4b 20 66 69 65 6c 64  compare PK field
8f70: 73 20 61 6e 64 20 74 68 65 79 20 63 61 6e 20 62  s and they can b
8f80: 65 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 61 20  e ignored for a 
8f90: 73 6d 61 6c 6c 0a 2a 2a 20 70 65 72 66 6f 72 6d  small.** perform
8fa0: 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 2a 2a 0a 2a  ance boost..**.*
8fb0: 2a 20 54 68 65 20 73 6f 72 74 65 72 20 63 61 6e  * The sorter can
8fc0: 20 67 75 61 72 61 6e 74 65 65 20 61 20 73 74 61   guarantee a sta
8fd0: 62 6c 65 20 73 6f 72 74 20 77 68 65 6e 20 72 75  ble sort when ru
8fe0: 6e 6e 69 6e 67 20 69 6e 20 73 69 6e 67 6c 65 2d  nning in single-
8ff0: 74 68 72 65 61 64 65 64 0a 2a 2a 20 6d 6f 64 65  threaded.** mode
9000: 2c 20 62 75 74 20 6e 6f 74 20 69 6e 20 6d 75 6c  , but not in mul
9010: 74 69 2d 74 68 72 65 61 64 65 64 20 6d 6f 64 65  ti-threaded mode
9020: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
9030: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
9040: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
9050: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
9060: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
9070: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
9080: 62 65 53 6f 72 74 65 72 49 6e 69 74 28 0a 20 20  beSorterInit(.  
9090: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
90c0: 65 63 74 69 6f 6e 20 28 66 6f 72 20 6d 61 6c 6c  ection (for mall
90d0: 6f 63 28 29 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  oc()) */.  int n
90e0: 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Field,          
90f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9100: 6d 62 65 72 20 6f 66 20 6b 65 79 20 66 69 65 6c  mber of key fiel
9110: 64 73 20 69 6e 20 65 61 63 68 20 72 65 63 6f 72  ds in each recor
9120: 64 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  d */.  VdbeCurso
9130: 72 20 2a 70 43 73 72 20 20 20 20 20 20 20 20 20  r *pCsr         
9140: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
9150: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
9160: 6e 65 77 20 73 6f 72 74 65 72 20 2a 2f 0a 29 7b  new sorter */.){
9170: 0a 20 20 69 6e 74 20 70 67 73 7a 3b 20 20 20 20  .  int pgsz;    
9180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9190: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
91a0: 6f 66 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  of main database
91b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
91e0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
91f0: 20 61 54 61 73 6b 5b 5d 20 2a 2f 0a 20 20 56 64   aTask[] */.  Vd
9200: 62 65 53 6f 72 74 65 72 20 2a 70 53 6f 72 74 65  beSorter *pSorte
9210: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
9220: 20 54 68 65 20 6e 65 77 20 73 6f 72 74 65 72 20   The new sorter 
9230: 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
9240: 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
9250: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
9260: 70 43 73 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 77  pCsr->pKeyInfo w
9270: 69 74 68 20 64 62 3d 3d 30 20 2a 2f 0a 20 20 69  ith db==0 */.  i
9280: 6e 74 20 73 7a 4b 65 79 49 6e 66 6f 3b 20 20 20  nt szKeyInfo;   
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
92a0: 2a 20 53 69 7a 65 20 6f 66 20 70 43 73 72 2d 3e  * Size of pCsr->
92b0: 70 4b 65 79 49 6e 66 6f 20 69 6e 20 62 79 74 65  pKeyInfo in byte
92c0: 73 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 3b 20 20  s */.  int sz;  
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92e0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
92f0: 66 20 70 53 6f 72 74 65 72 20 69 6e 20 62 79 74  f pSorter in byt
9300: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  es */.  int rc =
9310: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20   SQLITE_OK;.#if 
9320: 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
9330: 52 5f 54 48 52 45 41 44 53 3d 3d 30 0a 23 20 64  R_THREADS==0.# d
9340: 65 66 69 6e 65 20 6e 57 6f 72 6b 65 72 20 30 0a  efine nWorker 0.
9350: 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 57 6f 72  #else.  int nWor
9360: 6b 65 72 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ker;.#endif..  /
9370: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
9380: 20 75 70 70 65 72 20 6c 69 6d 69 74 20 6f 6e 20   upper limit on 
9390: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 6f  the number of wo
93a0: 72 6b 65 72 20 74 68 72 65 61 64 73 20 2a 2f 0a  rker threads */.
93b0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  #if SQLITE_MAX_W
93c0: 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 0a  ORKER_THREADS>0.
93d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 6d    if( sqlite3Tem
93e0: 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 20 7c 7c  pInMemory(db) ||
93f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
9400: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d  nfig.bCoreMutex=
9410: 3d 30 20 29 7b 0a 20 20 20 20 6e 57 6f 72 6b 65  =0 ){.    nWorke
9420: 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r = 0;.  }else{.
9430: 20 20 20 20 6e 57 6f 72 6b 65 72 20 3d 20 64 62      nWorker = db
9440: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
9450: 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
9460: 45 41 44 53 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69  EADS];.  }.#endi
9470: 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  f..  /* Do not a
9480: 6c 6c 6f 77 20 74 68 65 20 74 6f 74 61 6c 20 6e  llow the total n
9490: 75 6d 62 65 72 20 6f 66 20 74 68 72 65 61 64 73  umber of threads
94a0: 20 28 6d 61 69 6e 20 74 68 72 65 61 64 20 2b 20   (main thread + 
94b0: 61 6c 6c 20 77 6f 72 6b 65 72 73 29 0a 20 20 2a  all workers).  *
94c0: 2a 20 74 6f 20 65 78 63 65 65 64 20 74 68 65 20  * to exceed the 
94d0: 6d 61 78 69 6d 75 6d 20 6d 65 72 67 65 20 63 6f  maximum merge co
94e0: 75 6e 74 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  unt */.#if SQLIT
94f0: 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
9500: 45 41 44 53 3e 3d 53 4f 52 54 45 52 5f 4d 41 58  EADS>=SORTER_MAX
9510: 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 0a 20 20 69  _MERGE_COUNT.  i
9520: 66 28 20 6e 57 6f 72 6b 65 72 3e 3d 53 4f 52 54  f( nWorker>=SORT
9530: 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55  ER_MAX_MERGE_COU
9540: 4e 54 20 29 7b 0a 20 20 20 20 6e 57 6f 72 6b 65  NT ){.    nWorke
9550: 72 20 3d 20 53 4f 52 54 45 52 5f 4d 41 58 5f 4d  r = SORTER_MAX_M
9560: 45 52 47 45 5f 43 4f 55 4e 54 2d 31 3b 0a 20 20  ERGE_COUNT-1;.  
9570: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
9580: 72 74 28 20 70 43 73 72 2d 3e 70 4b 65 79 49 6e  rt( pCsr->pKeyIn
9590: 66 6f 20 26 26 20 70 43 73 72 2d 3e 70 42 74 78  fo && pCsr->pBtx
95a0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
95b0: 20 70 43 73 72 2d 3e 65 43 75 72 54 79 70 65 3d   pCsr->eCurType=
95c0: 3d 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52 20  =CURTYPE_SORTER 
95d0: 29 3b 0a 20 20 73 7a 4b 65 79 49 6e 66 6f 20 3d  );.  szKeyInfo =
95e0: 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29   sizeof(KeyInfo)
95f0: 20 2b 20 28 70 43 73 72 2d 3e 70 4b 65 79 49 6e   + (pCsr->pKeyIn
9600: 66 6f 2d 3e 6e 46 69 65 6c 64 2d 31 29 2a 73 69  fo->nField-1)*si
9610: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a  zeof(CollSeq*);.
9620: 20 20 73 7a 20 3d 20 73 69 7a 65 6f 66 28 56 64    sz = sizeof(Vd
9630: 62 65 53 6f 72 74 65 72 29 20 2b 20 6e 57 6f 72  beSorter) + nWor
9640: 6b 65 72 20 2a 20 73 69 7a 65 6f 66 28 53 6f 72  ker * sizeof(Sor
9650: 74 53 75 62 74 61 73 6b 29 3b 0a 0a 20 20 70 53  tSubtask);..  pS
9660: 6f 72 74 65 72 20 3d 20 28 56 64 62 65 53 6f 72  orter = (VdbeSor
9670: 74 65 72 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  ter*)sqlite3DbMa
9680: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 7a 20  llocZero(db, sz 
9690: 2b 20 73 7a 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  + szKeyInfo);.  
96a0: 70 43 73 72 2d 3e 75 63 2e 70 53 6f 72 74 65 72  pCsr->uc.pSorter
96b0: 20 3d 20 70 53 6f 72 74 65 72 3b 0a 20 20 69 66   = pSorter;.  if
96c0: 28 20 70 53 6f 72 74 65 72 3d 3d 30 20 29 7b 0a  ( pSorter==0 ){.
96d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
96e0: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65  NOMEM_BKPT;.  }e
96f0: 6c 73 65 7b 0a 20 20 20 20 70 53 6f 72 74 65 72  lse{.    pSorter
9700: 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
9710: 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f  yInfo = (KeyInfo
9720: 2a 29 28 28 75 38 2a 29 70 53 6f 72 74 65 72 20  *)((u8*)pSorter 
9730: 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70  + sz);.    memcp
9740: 79 28 70 4b 65 79 49 6e 66 6f 2c 20 70 43 73 72  y(pKeyInfo, pCsr
9750: 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 73 7a 4b 65  ->pKeyInfo, szKe
9760: 79 49 6e 66 6f 29 3b 0a 20 20 20 20 70 4b 65 79  yInfo);.    pKey
9770: 49 6e 66 6f 2d 3e 64 62 20 3d 20 30 3b 0a 20 20  Info->db = 0;.  
9780: 20 20 69 66 28 20 6e 46 69 65 6c 64 20 26 26 20    if( nField && 
9790: 6e 57 6f 72 6b 65 72 3d 3d 30 20 29 7b 0a 20 20  nWorker==0 ){.  
97a0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58      pKeyInfo->nX
97b0: 46 69 65 6c 64 20 2b 3d 20 28 70 4b 65 79 49 6e  Field += (pKeyIn
97c0: 66 6f 2d 3e 6e 46 69 65 6c 64 20 2d 20 6e 46 69  fo->nField - nFi
97d0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  eld);.      pKey
97e0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  Info->nField = n
97f0: 46 69 65 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 20  Field;.    }.   
9800: 20 70 53 6f 72 74 65 72 2d 3e 70 67 73 7a 20 3d   pSorter->pgsz =
9810: 20 70 67 73 7a 20 3d 20 73 71 6c 69 74 65 33 42   pgsz = sqlite3B
9820: 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
9830: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
9840: 0a 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 6e 54  .    pSorter->nT
9850: 61 73 6b 20 3d 20 6e 57 6f 72 6b 65 72 20 2b 20  ask = nWorker + 
9860: 31 3b 0a 20 20 20 20 70 53 6f 72 74 65 72 2d 3e  1;.    pSorter->
9870: 69 50 72 65 76 20 3d 20 28 75 38 29 28 6e 57 6f  iPrev = (u8)(nWo
9880: 72 6b 65 72 20 2d 20 31 29 3b 0a 20 20 20 20 70  rker - 1);.    p
9890: 53 6f 72 74 65 72 2d 3e 62 55 73 65 54 68 72 65  Sorter->bUseThre
98a0: 61 64 73 20 3d 20 28 70 53 6f 72 74 65 72 2d 3e  ads = (pSorter->
98b0: 6e 54 61 73 6b 3e 31 29 3b 0a 20 20 20 20 70 53  nTask>1);.    pS
98c0: 6f 72 74 65 72 2d 3e 64 62 20 3d 20 64 62 3b 0a  orter->db = db;.
98d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
98e0: 53 6f 72 74 65 72 2d 3e 6e 54 61 73 6b 3b 20 69  Sorter->nTask; i
98f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 53 6f 72 74 53  ++){.      SortS
9900: 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 20 3d 20  ubtask *pTask = 
9910: 26 70 53 6f 72 74 65 72 2d 3e 61 54 61 73 6b 5b  &pSorter->aTask[
9920: 69 5d 3b 0a 20 20 20 20 20 20 70 54 61 73 6b 2d  i];.      pTask-
9930: 3e 70 53 6f 72 74 65 72 20 3d 20 70 53 6f 72 74  >pSorter = pSort
9940: 65 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  er;.    }..    i
9950: 66 28 20 21 73 71 6c 69 74 65 33 54 65 6d 70 49  f( !sqlite3TempI
9960: 6e 4d 65 6d 6f 72 79 28 64 62 29 20 29 7b 0a 20  nMemory(db) ){. 
9970: 20 20 20 20 20 69 36 34 20 6d 78 43 61 63 68 65       i64 mxCache
9980: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9990: 20 2f 2a 20 43 61 63 68 65 20 73 69 7a 65 20 69   /* Cache size i
99a0: 6e 20 62 79 74 65 73 2a 2f 0a 20 20 20 20 20 20  n bytes*/.      
99b0: 75 33 32 20 73 7a 50 6d 61 20 3d 20 73 71 6c 69  u32 szPma = sqli
99c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
99d0: 73 7a 50 6d 61 3b 0a 20 20 20 20 20 20 70 53 6f  szPma;.      pSo
99e0: 72 74 65 72 2d 3e 6d 6e 50 6d 61 53 69 7a 65 20  rter->mnPmaSize 
99f0: 3d 20 73 7a 50 6d 61 20 2a 20 70 67 73 7a 3b 0a  = szPma * pgsz;.
9a00: 0a 20 20 20 20 20 20 6d 78 43 61 63 68 65 20 3d  .      mxCache =
9a10: 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68   db->aDb[0].pSch
9a20: 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b  ema->cache_size;
9a30: 0a 20 20 20 20 20 20 69 66 28 20 6d 78 43 61 63  .      if( mxCac
9a40: 68 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  he<0 ){.        
9a50: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 63 61  /* A negative ca
9a60: 63 68 65 2d 73 69 7a 65 20 76 61 6c 75 65 20 43  che-size value C
9a70: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
9a80: 74 68 65 20 63 61 63 68 65 20 69 73 20 61 62 73  the cache is abs
9a90: 28 43 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 4b  (C).        ** K
9aa0: 69 42 20 69 6e 20 73 69 7a 65 2e 20 20 2a 2f 0a  iB in size.  */.
9ab0: 20 20 20 20 20 20 20 20 6d 78 43 61 63 68 65 20          mxCache 
9ac0: 3d 20 6d 78 43 61 63 68 65 20 2a 20 2d 31 30 32  = mxCache * -102
9ad0: 34 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  4;.      }else{.
9ae0: 20 20 20 20 20 20 20 20 6d 78 43 61 63 68 65 20          mxCache 
9af0: 3d 20 6d 78 43 61 63 68 65 20 2a 20 70 67 73 7a  = mxCache * pgsz
9b00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9b10: 6d 78 43 61 63 68 65 20 3d 20 4d 49 4e 28 6d 78  mxCache = MIN(mx
9b20: 43 61 63 68 65 2c 20 53 51 4c 49 54 45 5f 4d 41  Cache, SQLITE_MA
9b30: 58 5f 50 4d 41 53 5a 29 3b 0a 20 20 20 20 20 20  X_PMASZ);.      
9b40: 70 53 6f 72 74 65 72 2d 3e 6d 78 50 6d 61 53 69  pSorter->mxPmaSi
9b50: 7a 65 20 3d 20 4d 41 58 28 70 53 6f 72 74 65 72  ze = MAX(pSorter
9b60: 2d 3e 6d 6e 50 6d 61 53 69 7a 65 2c 20 28 69 6e  ->mnPmaSize, (in
9b70: 74 29 6d 78 43 61 63 68 65 29 3b 0a 0a 20 20 20  t)mxCache);..   
9b80: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
9b90: 46 3a 20 52 2d 32 36 37 34 37 2d 36 31 37 31 39  F: R-26747-61719
9ba0: 20 57 68 65 6e 20 74 68 65 20 61 70 70 6c 69 63   When the applic
9bb0: 61 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ation provides a
9bc0: 6e 79 20 61 6d 6f 75 6e 74 20 6f 66 0a 20 20 20  ny amount of.   
9bd0: 20 20 20 2a 2a 20 73 63 72 61 74 63 68 20 6d 65     ** scratch me
9be0: 6d 6f 72 79 20 75 73 69 6e 67 20 53 51 4c 49 54  mory using SQLIT
9bf0: 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48  E_CONFIG_SCRATCH
9c00: 2c 20 53 51 4c 69 74 65 20 61 76 6f 69 64 73 20  , SQLite avoids 
9c10: 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 20 20  unnecessary.    
9c20: 20 20 2a 2a 20 6c 61 72 67 65 20 68 65 61 70 20    ** large heap 
9c30: 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 20  allocations..   
9c40: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
9c50: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
9c60: 66 69 67 2e 70 53 63 72 61 74 63 68 3d 3d 30 20  fig.pScratch==0 
9c70: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9c80: 74 28 20 70 53 6f 72 74 65 72 2d 3e 69 4d 65 6d  t( pSorter->iMem
9c90: 6f 72 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ory==0 );.      
9ca0: 20 20 70 53 6f 72 74 65 72 2d 3e 6e 4d 65 6d 6f    pSorter->nMemo
9cb0: 72 79 20 3d 20 70 67 73 7a 3b 0a 20 20 20 20 20  ry = pgsz;.     
9cc0: 20 20 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74     pSorter->list
9cd0: 2e 61 4d 65 6d 6f 72 79 20 3d 20 28 75 38 2a 29  .aMemory = (u8*)
9ce0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 70 67  sqlite3Malloc(pg
9cf0: 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  sz);.        if(
9d00: 20 21 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e   !pSorter->list.
9d10: 61 4d 65 6d 6f 72 79 20 29 20 72 63 20 3d 20 53  aMemory ) rc = S
9d20: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
9d30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9d40: 0a 20 20 20 20 69 66 28 20 28 70 4b 65 79 49 6e  .    if( (pKeyIn
9d50: 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49  fo->nField+pKeyI
9d60: 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 31 33  nfo->nXField)<13
9d70: 20 0a 20 20 20 20 20 26 26 20 28 70 4b 65 79 49   .     && (pKeyI
9d80: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30  nfo->aColl[0]==0
9d90: 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43   || pKeyInfo->aC
9da0: 6f 6c 6c 5b 30 5d 3d 3d 64 62 2d 3e 70 44 66 6c  oll[0]==db->pDfl
9db0: 74 43 6f 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20  tColl).    ){.  
9dc0: 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 74 79 70      pSorter->typ
9dd0: 65 4d 61 73 6b 20 3d 20 53 4f 52 54 45 52 5f 54  eMask = SORTER_T
9de0: 59 50 45 5f 49 4e 54 45 47 45 52 20 7c 20 53 4f  YPE_INTEGER | SO
9df0: 52 54 45 52 5f 54 59 50 45 5f 54 45 58 54 3b 0a  RTER_TYPE_TEXT;.
9e00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
9e10: 75 72 6e 20 72 63 3b 0a 7d 0a 23 75 6e 64 65 66  urn rc;.}.#undef
9e20: 20 6e 57 6f 72 6b 65 72 20 20 20 2f 2a 20 44 65   nWorker   /* De
9e30: 66 69 6e 65 64 20 61 74 20 74 68 65 20 74 6f 70  fined at the top
9e40: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
9e50: 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  n */../*.** Free
9e60: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6f 72   the list of sor
9e70: 74 65 64 20 72 65 63 6f 72 64 73 20 73 74 61 72  ted records star
9e80: 74 69 6e 67 20 61 74 20 70 52 65 63 6f 72 64 2e  ting at pRecord.
9e90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9ea0: 76 64 62 65 53 6f 72 74 65 72 52 65 63 6f 72 64  vdbeSorterRecord
9eb0: 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Free(sqlite3 *db
9ec0: 2c 20 53 6f 72 74 65 72 52 65 63 6f 72 64 20 2a  , SorterRecord *
9ed0: 70 52 65 63 6f 72 64 29 7b 0a 20 20 53 6f 72 74  pRecord){.  Sort
9ee0: 65 72 52 65 63 6f 72 64 20 2a 70 3b 0a 20 20 53  erRecord *p;.  S
9ef0: 6f 72 74 65 72 52 65 63 6f 72 64 20 2a 70 4e 65  orterRecord *pNe
9f00: 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 52 65 63  xt;.  for(p=pRec
9f10: 6f 72 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  ord; p; p=pNext)
9f20: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
9f30: 3e 75 2e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  >u.pNext;.    sq
9f40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9f50: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
9f60: 20 46 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   Free all resour
9f70: 63 65 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65  ces owned by the
9f80: 20 6f 62 6a 65 63 74 20 69 6e 64 69 63 61 74 65   object indicate
9f90: 64 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70 54  d by argument pT
9fa0: 61 73 6b 2e 20 41 6c 6c 20 0a 2a 2a 20 66 69 65  ask. All .** fie
9fb0: 6c 64 73 20 6f 66 20 2a 70 54 61 73 6b 20 61 72  lds of *pTask ar
9fc0: 65 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65 20  e zeroed before 
9fd0: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
9fe0: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 53 6f  atic void vdbeSo
9ff0: 72 74 53 75 62 74 61 73 6b 43 6c 65 61 6e 75 70  rtSubtaskCleanup
a000: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 6f  (sqlite3 *db, So
a010: 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b  rtSubtask *pTask
a020: 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  ){.  sqlite3DbFr
a030: 65 65 28 64 62 2c 20 70 54 61 73 6b 2d 3e 70 55  ee(db, pTask->pU
a040: 6e 70 61 63 6b 65 64 29 3b 0a 23 69 66 20 53 51  npacked);.#if SQ
a050: 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
a060: 54 48 52 45 41 44 53 3e 30 0a 20 20 2f 2a 20 70  THREADS>0.  /* p
a070: 54 61 73 6b 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f  Task->list.aMemo
a080: 72 79 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 6e  ry can only be n
a090: 6f 6e 2d 7a 65 72 6f 20 69 66 20 69 74 20 77 61  on-zero if it wa
a0a0: 73 20 68 61 6e 64 65 64 20 6d 65 6d 6f 72 79 0a  s handed memory.
a0b0: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 6d 61    ** from the ma
a0c0: 69 6e 20 74 68 72 65 61 64 2e 20 20 54 68 61 74  in thread.  That
a0d0: 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 53 51 4c   only occurs SQL
a0e0: 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
a0f0: 48 52 45 41 44 53 3e 30 20 2a 2f 0a 20 20 69 66  HREADS>0 */.  if
a100: 28 20 70 54 61 73 6b 2d 3e 6c 69 73 74 2e 61 4d  ( pTask->list.aM
a110: 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c  emory ){.    sql
a120: 69 74 65 33 5f 66 72 65 65 28 70 54 61 73 6b 2d  ite3_free(pTask-
a130: 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 29 3b 0a  >list.aMemory);.
a140: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
a150: 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   {.    assert( p
a160: 54 61 73 6b 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f  Task->list.aMemo
a170: 72 79 3d 3d 30 20 29 3b 0a 20 20 20 20 76 64 62  ry==0 );.    vdb
a180: 65 53 6f 72 74 65 72 52 65 63 6f 72 64 46 72 65  eSorterRecordFre
a190: 65 28 30 2c 20 70 54 61 73 6b 2d 3e 6c 69 73 74  e(0, pTask->list
a1a0: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69  .pList);.  }.  i
a1b0: 66 28 20 70 54 61 73 6b 2d 3e 66 69 6c 65 2e 70  f( pTask->file.p
a1c0: 46 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Fd ){.    sqlite
a1d0: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 54 61  3OsCloseFree(pTa
a1e0: 73 6b 2d 3e 66 69 6c 65 2e 70 46 64 29 3b 0a 20  sk->file.pFd);. 
a1f0: 20 7d 0a 20 20 69 66 28 20 70 54 61 73 6b 2d 3e   }.  if( pTask->
a200: 66 69 6c 65 32 2e 70 46 64 20 29 7b 0a 20 20 20  file2.pFd ){.   
a210: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
a220: 72 65 65 28 70 54 61 73 6b 2d 3e 66 69 6c 65 32  ree(pTask->file2
a230: 2e 70 46 64 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d  .pFd);.  }.  mem
a240: 73 65 74 28 70 54 61 73 6b 2c 20 30 2c 20 73 69  set(pTask, 0, si
a250: 7a 65 6f 66 28 53 6f 72 74 53 75 62 74 61 73 6b  zeof(SortSubtask
a260: 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ));.}..#ifdef SQ
a270: 4c 49 54 45 5f 44 45 42 55 47 5f 53 4f 52 54 45  LITE_DEBUG_SORTE
a280: 52 5f 54 48 52 45 41 44 53 0a 73 74 61 74 69 63  R_THREADS.static
a290: 20 76 6f 69 64 20 76 64 62 65 53 6f 72 74 65 72   void vdbeSorter
a2a0: 57 6f 72 6b 44 65 62 75 67 28 53 6f 72 74 53 75  WorkDebug(SortSu
a2b0: 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c 20 63 6f  btask *pTask, co
a2c0: 6e 73 74 20 63 68 61 72 20 2a 7a 45 76 65 6e 74  nst char *zEvent
a2d0: 29 7b 0a 20 20 69 36 34 20 74 3b 0a 20 20 69 6e  ){.  i64 t;.  in
a2e0: 74 20 69 54 61 73 6b 20 3d 20 28 70 54 61 73 6b  t iTask = (pTask
a2f0: 20 2d 20 70 54 61 73 6b 2d 3e 70 53 6f 72 74 65   - pTask->pSorte
a300: 72 2d 3e 61 54 61 73 6b 29 3b 0a 20 20 73 71 6c  r->aTask);.  sql
a310: 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
a320: 65 49 6e 74 36 34 28 70 54 61 73 6b 2d 3e 70 53  eInt64(pTask->pS
a330: 6f 72 74 65 72 2d 3e 64 62 2d 3e 70 56 66 73 2c  orter->db->pVfs,
a340: 20 26 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28   &t);.  fprintf(
a350: 73 74 64 65 72 72 2c 20 22 25 6c 6c 64 3a 25 64  stderr, "%lld:%d
a360: 20 25 73 5c 6e 22 2c 20 74 2c 20 69 54 61 73 6b   %s\n", t, iTask
a370: 2c 20 7a 45 76 65 6e 74 29 3b 0a 7d 0a 73 74 61  , zEvent);.}.sta
a380: 74 69 63 20 76 6f 69 64 20 76 64 62 65 53 6f 72  tic void vdbeSor
a390: 74 65 72 52 65 77 69 6e 64 44 65 62 75 67 28 63  terRewindDebug(c
a3a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 76 65 6e  onst char *zEven
a3b0: 74 29 7b 0a 20 20 69 36 34 20 74 3b 0a 20 20 73  t){.  i64 t;.  s
a3c0: 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
a3d0: 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33  imeInt64(sqlite3
a3e0: 5f 76 66 73 5f 66 69 6e 64 28 30 29 2c 20 26 74  _vfs_find(0), &t
a3f0: 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  );.  fprintf(std
a400: 65 72 72 2c 20 22 25 6c 6c 64 3a 58 20 25 73 5c  err, "%lld:X %s\
a410: 6e 22 2c 20 74 2c 20 7a 45 76 65 6e 74 29 3b 0a  n", t, zEvent);.
a420: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  }.static void vd
a430: 62 65 53 6f 72 74 65 72 50 6f 70 75 6c 61 74 65  beSorterPopulate
a440: 44 65 62 75 67 28 0a 20 20 53 6f 72 74 53 75 62  Debug(.  SortSub
a450: 74 61 73 6b 20 2a 70 54 61 73 6b 2c 0a 20 20 63  task *pTask,.  c
a460: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 76 65 6e  onst char *zEven
a470: 74 0a 29 7b 0a 20 20 69 36 34 20 74 3b 0a 20 20  t.){.  i64 t;.  
a480: 69 6e 74 20 69 54 61 73 6b 20 3d 20 28 70 54 61  int iTask = (pTa
a490: 73 6b 20 2d 20 70 54 61 73 6b 2d 3e 70 53 6f 72  sk - pTask->pSor
a4a0: 74 65 72 2d 3e 61 54 61 73 6b 29 3b 0a 20 20 73  ter->aTask);.  s
a4b0: 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
a4c0: 69 6d 65 49 6e 74 36 34 28 70 54 61 73 6b 2d 3e  imeInt64(pTask->
a4d0: 70 53 6f 72 74 65 72 2d 3e 64 62 2d 3e 70 56 66  pSorter->db->pVf
a4e0: 73 2c 20 26 74 29 3b 0a 20 20 66 70 72 69 6e 74  s, &t);.  fprint
a4f0: 66 28 73 74 64 65 72 72 2c 20 22 25 6c 6c 64 3a  f(stderr, "%lld:
a500: 62 67 25 64 20 25 73 5c 6e 22 2c 20 74 2c 20 69  bg%d %s\n", t, i
a510: 54 61 73 6b 2c 20 7a 45 76 65 6e 74 29 3b 0a 7d  Task, zEvent);.}
a520: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
a530: 65 53 6f 72 74 65 72 42 6c 6f 63 6b 44 65 62 75  eSorterBlockDebu
a540: 67 28 0a 20 20 53 6f 72 74 53 75 62 74 61 73 6b  g(.  SortSubtask
a550: 20 2a 70 54 61 73 6b 2c 0a 20 20 69 6e 74 20 62   *pTask,.  int b
a560: 42 6c 6f 63 6b 65 64 2c 0a 20 20 63 6f 6e 73 74  Blocked,.  const
a570: 20 63 68 61 72 20 2a 7a 45 76 65 6e 74 0a 29 7b   char *zEvent.){
a580: 0a 20 20 69 66 28 20 62 42 6c 6f 63 6b 65 64 20  .  if( bBlocked 
a590: 29 7b 0a 20 20 20 20 69 36 34 20 74 3b 0a 20 20  ){.    i64 t;.  
a5a0: 20 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65    sqlite3OsCurre
a5b0: 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 54 61 73  ntTimeInt64(pTas
a5c0: 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 64 62 2d 3e  k->pSorter->db->
a5d0: 70 56 66 73 2c 20 26 74 29 3b 0a 20 20 20 20 66  pVfs, &t);.    f
a5e0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
a5f0: 25 6c 6c 64 3a 6d 61 69 6e 20 25 73 5c 6e 22 2c  %lld:main %s\n",
a600: 20 74 2c 20 7a 45 76 65 6e 74 29 3b 0a 20 20 7d   t, zEvent);.  }
a610: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
a620: 65 20 76 64 62 65 53 6f 72 74 65 72 57 6f 72 6b  e vdbeSorterWork
a630: 44 65 62 75 67 28 78 2c 79 29 0a 23 20 64 65 66  Debug(x,y).# def
a640: 69 6e 65 20 76 64 62 65 53 6f 72 74 65 72 52 65  ine vdbeSorterRe
a650: 77 69 6e 64 44 65 62 75 67 28 79 29 0a 23 20 64  windDebug(y).# d
a660: 65 66 69 6e 65 20 76 64 62 65 53 6f 72 74 65 72  efine vdbeSorter
a670: 50 6f 70 75 6c 61 74 65 44 65 62 75 67 28 78 2c  PopulateDebug(x,
a680: 79 29 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65  y).# define vdbe
a690: 53 6f 72 74 65 72 42 6c 6f 63 6b 44 65 62 75 67  SorterBlockDebug
a6a0: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  (x,y,z).#endif..
a6b0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  #if SQLITE_MAX_W
a6c0: 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 0a  ORKER_THREADS>0.
a6d0: 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 68 72 65 61  /*.** Join threa
a6e0: 64 20 70 54 61 73 6b 2d 3e 74 68 72 65 61 64 2e  d pTask->thread.
a6f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
a700: 64 62 65 53 6f 72 74 65 72 4a 6f 69 6e 54 68 72  dbeSorterJoinThr
a710: 65 61 64 28 53 6f 72 74 53 75 62 74 61 73 6b 20  ead(SortSubtask 
a720: 2a 70 54 61 73 6b 29 7b 0a 20 20 69 6e 74 20 72  *pTask){.  int r
a730: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
a740: 20 69 66 28 20 70 54 61 73 6b 2d 3e 70 54 68 72   if( pTask->pThr
a750: 65 61 64 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ead ){.#ifdef SQ
a760: 4c 49 54 45 5f 44 45 42 55 47 5f 53 4f 52 54 45  LITE_DEBUG_SORTE
a770: 52 5f 54 48 52 45 41 44 53 0a 20 20 20 20 69 6e  R_THREADS.    in
a780: 74 20 62 44 6f 6e 65 20 3d 20 70 54 61 73 6b 2d  t bDone = pTask-
a790: 3e 62 44 6f 6e 65 3b 0a 23 65 6e 64 69 66 0a 20  >bDone;.#endif. 
a7a0: 20 20 20 76 6f 69 64 20 2a 70 52 65 74 20 3d 20     void *pRet = 
a7b0: 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
a7c0: 52 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 29 3b  R(SQLITE_ERROR);
a7d0: 0a 20 20 20 20 76 64 62 65 53 6f 72 74 65 72 42  .    vdbeSorterB
a7e0: 6c 6f 63 6b 44 65 62 75 67 28 70 54 61 73 6b 2c  lockDebug(pTask,
a7f0: 20 21 62 44 6f 6e 65 2c 20 22 65 6e 74 65 72 22   !bDone, "enter"
a800: 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c  );.    (void)sql
a810: 69 74 65 33 54 68 72 65 61 64 4a 6f 69 6e 28 70  ite3ThreadJoin(p
a820: 54 61 73 6b 2d 3e 70 54 68 72 65 61 64 2c 20 26  Task->pThread, &
a830: 70 52 65 74 29 3b 0a 20 20 20 20 76 64 62 65 53  pRet);.    vdbeS
a840: 6f 72 74 65 72 42 6c 6f 63 6b 44 65 62 75 67 28  orterBlockDebug(
a850: 70 54 61 73 6b 2c 20 21 62 44 6f 6e 65 2c 20 22  pTask, !bDone, "
a860: 65 78 69 74 22 29 3b 0a 20 20 20 20 72 63 20 3d  exit");.    rc =
a870: 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
a880: 4e 54 28 70 52 65 74 29 3b 0a 20 20 20 20 61 73  NT(pRet);.    as
a890: 73 65 72 74 28 20 70 54 61 73 6b 2d 3e 62 44 6f  sert( pTask->bDo
a8a0: 6e 65 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61  ne==1 );.    pTa
a8b0: 73 6b 2d 3e 62 44 6f 6e 65 20 3d 20 30 3b 0a 20  sk->bDone = 0;. 
a8c0: 20 20 20 70 54 61 73 6b 2d 3e 70 54 68 72 65 61     pTask->pThrea
a8d0: 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 0;.  }.  ret
a8e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
a8f0: 20 4c 61 75 6e 63 68 20 61 20 62 61 63 6b 67 72   Launch a backgr
a900: 6f 75 6e 64 20 74 68 72 65 61 64 20 74 6f 20 72  ound thread to r
a910: 75 6e 20 78 54 61 73 6b 28 70 49 6e 29 2e 0a 2a  un xTask(pIn)..*
a920: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
a930: 65 53 6f 72 74 65 72 43 72 65 61 74 65 54 68 72  eSorterCreateThr
a940: 65 61 64 28 0a 20 20 53 6f 72 74 53 75 62 74 61  ead(.  SortSubta
a950: 73 6b 20 2a 70 54 61 73 6b 2c 20 20 20 20 20 20  sk *pTask,      
a960: 20 20 20 20 20 20 20 2f 2a 20 54 68 72 65 61 64         /* Thread
a970: 20 77 69 6c 6c 20 75 73 65 20 74 68 69 73 20 74   will use this t
a980: 61 73 6b 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ask object */.  
a990: 76 6f 69 64 20 2a 28 2a 78 54 61 73 6b 29 28 76  void *(*xTask)(v
a9a0: 6f 69 64 2a 29 2c 20 20 20 20 20 20 20 20 20 20  oid*),          
a9b0: 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 72 75  /* Routine to ru
a9c0: 6e 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20  n in a separate 
a9d0: 74 68 72 65 61 64 20 2a 2f 0a 20 20 76 6f 69 64  thread */.  void
a9e0: 20 2a 70 49 6e 20 20 20 20 20 20 20 20 20 20 20   *pIn           
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
aa00: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 69  rgument passed i
aa10: 6e 74 6f 20 78 54 61 73 6b 28 29 20 2a 2f 0a 29  nto xTask() */.)
aa20: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 73  {.  assert( pTas
aa30: 6b 2d 3e 70 54 68 72 65 61 64 3d 3d 30 20 26 26  k->pThread==0 &&
aa40: 20 70 54 61 73 6b 2d 3e 62 44 6f 6e 65 3d 3d 30   pTask->bDone==0
aa50: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
aa60: 69 74 65 33 54 68 72 65 61 64 43 72 65 61 74 65  ite3ThreadCreate
aa70: 28 26 70 54 61 73 6b 2d 3e 70 54 68 72 65 61 64  (&pTask->pThread
aa80: 2c 20 78 54 61 73 6b 2c 20 70 49 6e 29 3b 0a 7d  , xTask, pIn);.}
aa90: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 61 6c 6c  ../*.** Join all
aaa0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 74 68 72   outstanding thr
aab0: 65 61 64 73 20 6c 61 75 6e 63 68 65 64 20 62 79  eads launched by
aac0: 20 53 6f 72 74 65 72 57 72 69 74 65 28 29 20 74   SorterWrite() t
aad0: 6f 20 63 72 65 61 74 65 20 0a 2a 2a 20 6c 65 76  o create .** lev
aae0: 65 6c 2d 30 20 50 4d 41 73 2e 0a 2a 2f 0a 73 74  el-0 PMAs..*/.st
aaf0: 61 74 69 63 20 69 6e 74 20 76 64 62 65 53 6f 72  atic int vdbeSor
ab00: 74 65 72 4a 6f 69 6e 41 6c 6c 28 56 64 62 65 53  terJoinAll(VdbeS
ab10: 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72 2c 20  orter *pSorter, 
ab20: 69 6e 74 20 72 63 69 6e 29 7b 0a 20 20 69 6e 74  int rcin){.  int
ab30: 20 72 63 20 3d 20 72 63 69 6e 3b 0a 20 20 69 6e   rc = rcin;.  in
ab40: 74 20 69 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  t i;..  /* This 
ab50: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 77 61  function is alwa
ab60: 79 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  ys called by the
ab70: 20 6d 61 69 6e 20 75 73 65 72 20 74 68 72 65 61   main user threa
ab80: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
ab90: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
aba0: 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 61 66   being called af
abb0: 74 65 72 20 53 6f 72 74 65 72 52 65 77 69 6e 64  ter SorterRewind
abc0: 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
abd0: 65 64 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73 20  ed, .  ** it is 
abe0: 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74 68  possible that th
abf0: 72 65 61 64 20 70 53 6f 72 74 65 72 2d 3e 61 54  read pSorter->aT
ac00: 61 73 6b 5b 70 53 6f 72 74 65 72 2d 3e 6e 54 61  ask[pSorter->nTa
ac10: 73 6b 2d 31 5d 2e 70 54 68 72 65 61 64 0a 20 20  sk-1].pThread.  
ac20: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
ac30: 61 74 74 65 6d 70 74 20 74 6f 20 6a 6f 69 6e 20  attempt to join 
ac40: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  one of the other
ac50: 20 74 68 72 65 61 64 73 2e 20 54 6f 20 61 76 6f   threads. To avo
ac60: 69 64 20 61 20 72 61 63 65 0a 20 20 2a 2a 20 63  id a race.  ** c
ac70: 6f 6e 64 69 74 69 6f 6e 20 77 68 65 72 65 20 74  ondition where t
ac80: 68 69 73 20 74 68 72 65 61 64 20 61 6c 73 6f 20  his thread also 
ac90: 61 74 74 65 6d 70 74 73 20 74 6f 20 6a 6f 69 6e  attempts to join
aca0: 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63 74   the same object
acb0: 2c 20 6a 6f 69 6e 20 0a 20 20 2a 2a 20 74 68 72  , join .  ** thr
acc0: 65 61 64 20 70 53 6f 72 74 65 72 2d 3e 61 54 61  ead pSorter->aTa
acd0: 73 6b 5b 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73  sk[pSorter->nTas
ace0: 6b 2d 31 5d 2e 70 54 68 72 65 61 64 20 66 69 72  k-1].pThread fir
acf0: 73 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70  st. */.  for(i=p
ad00: 53 6f 72 74 65 72 2d 3e 6e 54 61 73 6b 2d 31 3b  Sorter->nTask-1;
ad10: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
ad20: 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54   SortSubtask *pT
ad30: 61 73 6b 20 3d 20 26 70 53 6f 72 74 65 72 2d 3e  ask = &pSorter->
ad40: 61 54 61 73 6b 5b 69 5d 3b 0a 20 20 20 20 69 6e  aTask[i];.    in
ad50: 74 20 72 63 32 20 3d 20 76 64 62 65 53 6f 72 74  t rc2 = vdbeSort
ad60: 65 72 4a 6f 69 6e 54 68 72 65 61 64 28 70 54 61  erJoinThread(pTa
ad70: 73 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  sk);.    if( rc=
ad80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
ad90: 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 72 65 74  = rc2;.  }.  ret
ada0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a  urn rc;.}.#else.
adb0: 23 20 64 65 66 69 6e 65 20 76 64 62 65 53 6f 72  # define vdbeSor
adc0: 74 65 72 4a 6f 69 6e 41 6c 6c 28 78 2c 72 63 69  terJoinAll(x,rci
add0: 6e 29 20 28 72 63 69 6e 29 0a 23 20 64 65 66 69  n) (rcin).# defi
ade0: 6e 65 20 76 64 62 65 53 6f 72 74 65 72 4a 6f 69  ne vdbeSorterJoi
adf0: 6e 54 68 72 65 61 64 28 70 54 61 73 6b 29 20 53  nThread(pTask) S
ae00: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
ae10: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
ae20: 61 20 6e 65 77 20 4d 65 72 67 65 45 6e 67 69 6e  a new MergeEngin
ae30: 65 20 6f 62 6a 65 63 74 20 63 61 70 61 62 6c 65  e object capable
ae40: 20 6f 66 20 68 61 6e 64 6c 69 6e 67 20 75 70 20   of handling up 
ae50: 74 6f 0a 2a 2a 20 6e 52 65 61 64 65 72 20 50 6d  to.** nReader Pm
ae60: 61 52 65 61 64 65 72 20 69 6e 70 75 74 73 2e 0a  aReader inputs..
ae70: 2a 2a 0a 2a 2a 20 6e 52 65 61 64 65 72 20 69 73  **.** nReader is
ae80: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 72   automatically r
ae90: 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65  ounded up to the
aea0: 20 6e 65 78 74 20 70 6f 77 65 72 20 6f 66 20 74   next power of t
aeb0: 77 6f 2e 0a 2a 2a 20 6e 52 65 61 64 65 72 20 6d  wo..** nReader m
aec0: 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 53 4f  ay not exceed SO
aed0: 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43  RTER_MAX_MERGE_C
aee0: 4f 55 4e 54 20 65 76 65 6e 20 61 66 74 65 72 20  OUNT even after 
aef0: 72 6f 75 6e 64 69 6e 67 20 75 70 2e 0a 2a 2f 0a  rounding up..*/.
af00: 73 74 61 74 69 63 20 4d 65 72 67 65 45 6e 67 69  static MergeEngi
af10: 6e 65 20 2a 76 64 62 65 4d 65 72 67 65 45 6e 67  ne *vdbeMergeEng
af20: 69 6e 65 4e 65 77 28 69 6e 74 20 6e 52 65 61 64  ineNew(int nRead
af30: 65 72 29 7b 0a 20 20 69 6e 74 20 4e 20 3d 20 32  er){.  int N = 2
af40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
af50: 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65         /* Smalle
af60: 73 74 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20  st power of two 
af70: 3e 3d 20 6e 52 65 61 64 65 72 20 2a 2f 0a 20 20  >= nReader */.  
af80: 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afa0: 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65 73 20 6f  /* Total bytes o
afb0: 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  f space to alloc
afc0: 61 74 65 20 2a 2f 0a 20 20 4d 65 72 67 65 45 6e  ate */.  MergeEn
afd0: 67 69 6e 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  gine *pNew;     
afe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
aff0: 74 65 72 20 74 6f 20 61 6c 6c 6f 63 61 74 65 64  ter to allocated
b000: 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72   object to retur
b010: 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  n */..  assert( 
b020: 6e 52 65 61 64 65 72 3c 3d 53 4f 52 54 45 52 5f  nReader<=SORTER_
b030: 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20  MAX_MERGE_COUNT 
b040: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 4e 3c 6e  );..  while( N<n
b050: 52 65 61 64 65 72 20 29 20 4e 20 2b 3d 20 4e 3b  Reader ) N += N;
b060: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
b070: 66 28 4d 65 72 67 65 45 6e 67 69 6e 65 29 20 2b  f(MergeEngine) +
b080: 20 4e 20 2a 20 28 73 69 7a 65 6f 66 28 69 6e 74   N * (sizeof(int
b090: 29 20 2b 20 73 69 7a 65 6f 66 28 50 6d 61 52 65  ) + sizeof(PmaRe
b0a0: 61 64 65 72 29 29 3b 0a 0a 20 20 70 4e 65 77 20  ader));..  pNew 
b0b0: 3d 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69  = sqlite3FaultSi
b0c0: 6d 28 31 30 30 29 20 3f 20 30 20 3a 20 28 4d 65  m(100) ? 0 : (Me
b0d0: 72 67 65 45 6e 67 69 6e 65 2a 29 73 71 6c 69 74  rgeEngine*)sqlit
b0e0: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 42 79  e3MallocZero(nBy
b0f0: 74 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  te);.  if( pNew 
b100: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 54 72  ){.    pNew->nTr
b110: 65 65 20 3d 20 4e 3b 0a 20 20 20 20 70 4e 65 77  ee = N;.    pNew
b120: 2d 3e 70 54 61 73 6b 20 3d 20 30 3b 0a 20 20 20  ->pTask = 0;.   
b130: 20 70 4e 65 77 2d 3e 61 52 65 61 64 72 20 3d 20   pNew->aReadr = 
b140: 28 50 6d 61 52 65 61 64 65 72 2a 29 26 70 4e 65  (PmaReader*)&pNe
b150: 77 5b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  w[1];.    pNew->
b160: 61 54 72 65 65 20 3d 20 28 69 6e 74 2a 29 26 70  aTree = (int*)&p
b170: 4e 65 77 2d 3e 61 52 65 61 64 72 5b 4e 5d 3b 0a  New->aReadr[N];.
b180: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
b190: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  w;.}../*.** Free
b1a0: 20 74 68 65 20 4d 65 72 67 65 45 6e 67 69 6e 65   the MergeEngine
b1b0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
b1c0: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
b1d0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
b1e0: 6f 69 64 20 76 64 62 65 4d 65 72 67 65 45 6e 67  oid vdbeMergeEng
b1f0: 69 6e 65 46 72 65 65 28 4d 65 72 67 65 45 6e 67  ineFree(MergeEng
b200: 69 6e 65 20 2a 70 4d 65 72 67 65 72 29 7b 0a 20  ine *pMerger){. 
b210: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4d   int i;.  if( pM
b220: 65 72 67 65 72 20 29 7b 0a 20 20 20 20 66 6f 72  erger ){.    for
b230: 28 69 3d 30 3b 20 69 3c 70 4d 65 72 67 65 72 2d  (i=0; i<pMerger-
b240: 3e 6e 54 72 65 65 3b 20 69 2b 2b 29 7b 0a 20 20  >nTree; i++){.  
b250: 20 20 20 20 76 64 62 65 50 6d 61 52 65 61 64 65      vdbePmaReade
b260: 72 43 6c 65 61 72 28 26 70 4d 65 72 67 65 72 2d  rClear(&pMerger-
b270: 3e 61 52 65 61 64 72 5b 69 5d 29 3b 0a 20 20 20  >aReadr[i]);.   
b280: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
b290: 5f 66 72 65 65 28 70 4d 65 72 67 65 72 29 3b 0a  _free(pMerger);.
b2a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
b2b0: 6c 20 72 65 73 6f 75 72 63 65 73 20 61 73 73 6f  l resources asso
b2c0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
b2d0: 49 6e 63 72 4d 65 72 67 65 72 20 6f 62 6a 65 63  IncrMerger objec
b2e0: 74 20 69 6e 64 69 63 61 74 65 64 20 62 79 0a 2a  t indicated by.*
b2f0: 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  * the first argu
b300: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
b310: 76 6f 69 64 20 76 64 62 65 49 6e 63 72 46 72 65  void vdbeIncrFre
b320: 65 28 49 6e 63 72 4d 65 72 67 65 72 20 2a 70 49  e(IncrMerger *pI
b330: 6e 63 72 29 7b 0a 20 20 69 66 28 20 70 49 6e 63  ncr){.  if( pInc
b340: 72 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  r ){.#if SQLITE_
b350: 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
b360: 44 53 3e 30 0a 20 20 20 20 69 66 28 20 70 49 6e  DS>0.    if( pIn
b370: 63 72 2d 3e 62 55 73 65 54 68 72 65 61 64 20 29  cr->bUseThread )
b380: 7b 0a 20 20 20 20 20 20 76 64 62 65 53 6f 72 74  {.      vdbeSort
b390: 65 72 4a 6f 69 6e 54 68 72 65 61 64 28 70 49 6e  erJoinThread(pIn
b3a0: 63 72 2d 3e 70 54 61 73 6b 29 3b 0a 20 20 20 20  cr->pTask);.    
b3b0: 20 20 69 66 28 20 70 49 6e 63 72 2d 3e 61 46 69    if( pIncr->aFi
b3c0: 6c 65 5b 30 5d 2e 70 46 64 20 29 20 73 71 6c 69  le[0].pFd ) sqli
b3d0: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
b3e0: 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 30 5d 2e 70  Incr->aFile[0].p
b3f0: 46 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Fd);.      if( p
b400: 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 31 5d 2e 70  Incr->aFile[1].p
b410: 46 64 20 29 20 73 71 6c 69 74 65 33 4f 73 43 6c  Fd ) sqlite3OsCl
b420: 6f 73 65 46 72 65 65 28 70 49 6e 63 72 2d 3e 61  oseFree(pIncr->a
b430: 46 69 6c 65 5b 31 5d 2e 70 46 64 29 3b 0a 20 20  File[1].pFd);.  
b440: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 76    }.#endif.    v
b450: 64 62 65 4d 65 72 67 65 45 6e 67 69 6e 65 46 72  dbeMergeEngineFr
b460: 65 65 28 70 49 6e 63 72 2d 3e 70 4d 65 72 67 65  ee(pIncr->pMerge
b470: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
b480: 66 72 65 65 28 70 49 6e 63 72 29 3b 0a 20 20 7d  free(pIncr);.  }
b490: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
b4a0: 61 20 73 6f 72 74 69 6e 67 20 63 75 72 73 6f 72  a sorting cursor
b4b0: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
b4c0: 67 69 6e 61 6c 20 65 6d 70 74 79 20 73 74 61 74  ginal empty stat
b4d0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
b4e0: 65 33 56 64 62 65 53 6f 72 74 65 72 52 65 73 65  e3VdbeSorterRese
b4f0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
b500: 64 62 65 53 6f 72 74 65 72 20 2a 70 53 6f 72 74  dbeSorter *pSort
b510: 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  er){.  int i;.  
b520: 28 76 6f 69 64 29 76 64 62 65 53 6f 72 74 65 72  (void)vdbeSorter
b530: 4a 6f 69 6e 41 6c 6c 28 70 53 6f 72 74 65 72 2c  JoinAll(pSorter,
b540: 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 61   SQLITE_OK);.  a
b550: 73 73 65 72 74 28 20 70 53 6f 72 74 65 72 2d 3e  ssert( pSorter->
b560: 62 55 73 65 54 68 72 65 61 64 73 20 7c 7c 20 70  bUseThreads || p
b570: 53 6f 72 74 65 72 2d 3e 70 52 65 61 64 65 72 3d  Sorter->pReader=
b580: 3d 30 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  =0 );.#if SQLITE
b590: 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
b5a0: 41 44 53 3e 30 0a 20 20 69 66 28 20 70 53 6f 72  ADS>0.  if( pSor
b5b0: 74 65 72 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a  ter->pReader ){.
b5c0: 20 20 20 20 76 64 62 65 50 6d 61 52 65 61 64 65      vdbePmaReade
b5d0: 72 43 6c 65 61 72 28 70 53 6f 72 74 65 72 2d 3e  rClear(pSorter->
b5e0: 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 73 71  pReader);.    sq
b5f0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b600: 70 53 6f 72 74 65 72 2d 3e 70 52 65 61 64 65 72  pSorter->pReader
b610: 29 3b 0a 20 20 20 20 70 53 6f 72 74 65 72 2d 3e  );.    pSorter->
b620: 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 7d  pReader = 0;.  }
b630: 0a 23 65 6e 64 69 66 0a 20 20 76 64 62 65 4d 65  .#endif.  vdbeMe
b640: 72 67 65 45 6e 67 69 6e 65 46 72 65 65 28 70 53  rgeEngineFree(pS
b650: 6f 72 74 65 72 2d 3e 70 4d 65 72 67 65 72 29 3b  orter->pMerger);
b660: 0a 20 20 70 53 6f 72 74 65 72 2d 3e 70 4d 65 72  .  pSorter->pMer
b670: 67 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ger = 0;.  for(i
b680: 3d 30 3b 20 69 3c 70 53 6f 72 74 65 72 2d 3e 6e  =0; i<pSorter->n
b690: 54 61 73 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Task; i++){.    
b6a0: 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61  SortSubtask *pTa
b6b0: 73 6b 20 3d 20 26 70 53 6f 72 74 65 72 2d 3e 61  sk = &pSorter->a
b6c0: 54 61 73 6b 5b 69 5d 3b 0a 20 20 20 20 76 64 62  Task[i];.    vdb
b6d0: 65 53 6f 72 74 53 75 62 74 61 73 6b 43 6c 65 61  eSortSubtaskClea
b6e0: 6e 75 70 28 64 62 2c 20 70 54 61 73 6b 29 3b 0a  nup(db, pTask);.
b6f0: 20 20 20 20 70 54 61 73 6b 2d 3e 70 53 6f 72 74      pTask->pSort
b700: 65 72 20 3d 20 70 53 6f 72 74 65 72 3b 0a 20 20  er = pSorter;.  
b710: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 65 72 2d  }.  if( pSorter-
b720: 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 3d 3d 30  >list.aMemory==0
b730: 20 29 7b 0a 20 20 20 20 76 64 62 65 53 6f 72 74   ){.    vdbeSort
b740: 65 72 52 65 63 6f 72 64 46 72 65 65 28 30 2c 20  erRecordFree(0, 
b750: 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 70 4c  pSorter->list.pL
b760: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70 53 6f 72  ist);.  }.  pSor
b770: 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 20  ter->list.pList 
b780: 3d 20 30 3b 0a 20 20 70 53 6f 72 74 65 72 2d 3e  = 0;.  pSorter->
b790: 6c 69 73 74 2e 73 7a 50 4d 41 20 3d 20 30 3b 0a  list.szPMA = 0;.
b7a0: 20 20 70 53 6f 72 74 65 72 2d 3e 62 55 73 65 50    pSorter->bUseP
b7b0: 4d 41 20 3d 20 30 3b 0a 20 20 70 53 6f 72 74 65  MA = 0;.  pSorte
b7c0: 72 2d 3e 69 4d 65 6d 6f 72 79 20 3d 20 30 3b 0a  r->iMemory = 0;.
b7d0: 20 20 70 53 6f 72 74 65 72 2d 3e 6d 78 4b 65 79    pSorter->mxKey
b7e0: 73 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  size = 0;.  sqli
b7f0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
b800: 6f 72 74 65 72 2d 3e 70 55 6e 70 61 63 6b 65 64  orter->pUnpacked
b810: 29 3b 0a 20 20 70 53 6f 72 74 65 72 2d 3e 70 55  );.  pSorter->pU
b820: 6e 70 61 63 6b 65 64 20 3d 20 30 3b 0a 7d 0a 0a  npacked = 0;.}..
b830: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 63  /*.** Free any c
b840: 75 72 73 6f 72 20 63 6f 6d 70 6f 6e 65 6e 74 73  ursor components
b850: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 73 71   allocated by sq
b860: 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 58  lite3VdbeSorterX
b870: 58 58 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a  XX routines..*/.
b880: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
b890: 53 6f 72 74 65 72 43 6c 6f 73 65 28 73 71 6c 69  SorterClose(sqli
b8a0: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 43 75 72  te3 *db, VdbeCur
b8b0: 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 56 64  sor *pCsr){.  Vd
b8c0: 62 65 53 6f 72 74 65 72 20 2a 70 53 6f 72 74 65  beSorter *pSorte
b8d0: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  r;.  assert( pCs
b8e0: 72 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  r->eCurType==CUR
b8f0: 54 59 50 45 5f 53 4f 52 54 45 52 20 29 3b 0a 20  TYPE_SORTER );. 
b900: 20 70 53 6f 72 74 65 72 20 3d 20 70 43 73 72 2d   pSorter = pCsr-
b910: 3e 75 63 2e 70 53 6f 72 74 65 72 3b 0a 20 20 69  >uc.pSorter;.  i
b920: 66 28 20 70 53 6f 72 74 65 72 20 29 7b 0a 20 20  f( pSorter ){.  
b930: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72    sqlite3VdbeSor
b940: 74 65 72 52 65 73 65 74 28 64 62 2c 20 70 53 6f  terReset(db, pSo
b950: 72 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rter);.    sqlit
b960: 65 33 5f 66 72 65 65 28 70 53 6f 72 74 65 72 2d  e3_free(pSorter-
b970: 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 29 3b 0a  >list.aMemory);.
b980: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b990: 65 28 64 62 2c 20 70 53 6f 72 74 65 72 29 3b 0a  e(db, pSorter);.
b9a0: 20 20 20 20 70 43 73 72 2d 3e 75 63 2e 70 53 6f      pCsr->uc.pSo
b9b0: 72 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  rter = 0;.  }.}.
b9c0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
b9d0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
b9e0: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
b9f0: 6d 65 6e 74 20 69 73 20 61 20 66 69 6c 65 2d 68  ment is a file-h
ba00: 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 61 20  andle open on a 
ba10: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
ba20: 54 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67  The file.** is g
ba30: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
ba40: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 72 20 73  nByte bytes or s
ba50: 6d 61 6c 6c 65 72 20 69 6e 20 73 69 7a 65 2e 20  maller in size. 
ba60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
ba70: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78 74   attempts to ext
ba80: 65 6e 64 20 74 68 65 20 66 69 6c 65 20 74 6f 20  end the file to 
ba90: 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 20 73  nByte bytes in s
baa0: 69 7a 65 20 61 6e 64 20 74 6f 20 65 6e 73 75 72  ize and to ensur
bab0: 65 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 56 46  e that.** the VF
bac0: 53 20 68 61 73 20 6d 65 6d 6f 72 79 20 6d 61 70  S has memory map
bad0: 70 65 64 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  ped it..**.** Wh
bae0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
baf0: 20 66 69 6c 65 20 64 6f 65 73 20 65 6e 64 20 75   file does end u
bb00: 70 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  p memory mapped 
bb10: 6f 66 20 63 6f 75 72 73 65 20 64 65 70 65 6e 64  of course depend
bb20: 73 20 6f 6e 0a 2a 2a 20 74 68 65 20 73 70 65 63  s on.** the spec
bb30: 69 66 69 63 20 56 46 53 20 69 6d 70 6c 65 6d 65  ific VFS impleme
bb40: 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ntation..*/.stat
bb50: 69 63 20 76 6f 69 64 20 76 64 62 65 53 6f 72 74  ic void vdbeSort
bb60: 65 72 45 78 74 65 6e 64 46 69 6c 65 28 73 71 6c  erExtendFile(sql
bb70: 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74 65  ite3 *db, sqlite
bb80: 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 36 34  3_file *pFd, i64
bb90: 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20 6e   nByte){.  if( n
bba0: 42 79 74 65 3c 3d 28 69 36 34 29 28 64 62 2d 3e  Byte<=(i64)(db->
bbb0: 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 29 20  nMaxSorterMmap) 
bbc0: 26 26 20 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73  && pFd->pMethods
bbd0: 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b  ->iVersion>=3 ){
bbe0: 0a 20 20 20 20 76 6f 69 64 20 2a 70 20 3d 20 30  .    void *p = 0
bbf0: 3b 0a 20 20 20 20 69 6e 74 20 63 68 75 6e 6b 73  ;.    int chunks
bc00: 69 7a 65 20 3d 20 34 2a 31 30 32 34 3b 0a 20 20  ize = 4*1024;.  
bc10: 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
bc20: 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 64 2c 20  ontrolHint(pFd, 
bc30: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
bc40: 4e 4b 5f 53 49 5a 45 2c 20 26 63 68 75 6e 6b 73  NK_SIZE, &chunks
bc50: 69 7a 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ize);.    sqlite
bc60: 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
bc70: 6e 74 28 70 46 64 2c 20 53 51 4c 49 54 45 5f 46  nt(pFd, SQLITE_F
bc80: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20  CNTL_SIZE_HINT, 
bc90: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 73 71 6c  &nByte);.    sql
bca0: 69 74 65 33 4f 73 46 65 74 63 68 28 70 46 64 2c  ite3OsFetch(pFd,
bcb0: 20 30 2c 20 28 69 6e 74 29 6e 42 79 74 65 2c 20   0, (int)nByte, 
bcc0: 26 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  &p);.    sqlite3
bcd0: 4f 73 55 6e 66 65 74 63 68 28 70 46 64 2c 20 30  OsUnfetch(pFd, 0
bce0: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  , p);.  }.}.#els
bcf0: 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 53  e.# define vdbeS
bd00: 6f 72 74 65 72 45 78 74 65 6e 64 46 69 6c 65 28  orterExtendFile(
bd10: 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f  x,y,z).#endif../
bd20: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70  *.** Allocate sp
bd30: 61 63 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 68  ace for a file-h
bd40: 61 6e 64 6c 65 20 61 6e 64 20 6f 70 65 6e 20 61  andle and open a
bd50: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
bd60: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
bd70: 2a 2a 20 73 65 74 20 2a 70 70 46 64 20 74 6f 20  ** set *ppFd to 
bd80: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 6c  point to the mal
bd90: 6c 6f 63 27 64 20 66 69 6c 65 2d 68 61 6e 64 6c  loc'd file-handl
bda0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
bdb0: 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72  ITE_OK..** Other
bdc0: 77 69 73 65 2c 20 73 65 74 20 2a 70 70 46 64 20  wise, set *ppFd 
bdd0: 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20  to 0 and return 
bde0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
bdf0: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
be00: 69 6e 74 20 76 64 62 65 53 6f 72 74 65 72 4f 70  int vdbeSorterOp
be10: 65 6e 54 65 6d 70 46 69 6c 65 28 0a 20 20 73 71  enTempFile(.  sq
be20: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be40: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
be50: 20 64 6f 69 6e 67 20 73 6f 72 74 20 2a 2f 0a 20   doing sort */. 
be60: 20 69 36 34 20 6e 45 78 74 65 6e 64 2c 20 20 20   i64 nExtend,   
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be80: 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 65   /* Attempt to e
be90: 78 74 65 6e 64 20 66 69 6c 65 20 74 6f 20 74 68  xtend file to th
bea0: 69 73 20 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c  is size */.  sql
beb0: 69 74 65 33 5f 66 69 6c 65 20 2a 2a 70 70 46 64  ite3_file **ppFd
bec0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
bed0: 69 66 28 20 73 71 6c 69 74 65 33 46 61 75 6c 74  if( sqlite3Fault
bee0: 53 69 6d 28 32 30 32 29 20 29 20 72 65 74 75 72  Sim(202) ) retur
bef0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
bf00: 43 43 45 53 53 3b 0a 20 20 72 63 20 3d 20 73 71  CCESS;.  rc = sq
bf10: 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f  lite3OsOpenMallo
bf20: 63 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 70  c(db->pVfs, 0, p
bf30: 70 46 64 2c 0a 20 20 20 20 20 20 53 51 4c 49 54  pFd,.      SQLIT
bf40: 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
bf50: 4e 41 4c 20 7c 0a 20 20 20 20 20 20 53 51 4c 49  NAL |.      SQLI
bf60: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
bf70: 45 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50  E    | SQLITE_OP
bf80: 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
bf90: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
bfa0: 43 4c 55 53 49 56 45 20 20 20 20 7c 20 53 51 4c  CLUSIVE    | SQL
bfb0: 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
bfc0: 4e 43 4c 4f 53 45 2c 20 26 72 63 0a 20 20 29 3b  NCLOSE, &rc.  );
bfd0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
bfe0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 36 34 20  E_OK ){.    i64 
bff0: 6d 61 78 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  max = SQLITE_MAX
c000: 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20  _MMAP_SIZE;.    
c010: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
c020: 74 72 6f 6c 48 69 6e 74 28 2a 70 70 46 64 2c 20  trolHint(*ppFd, 
c030: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
c040: 50 5f 53 49 5a 45 2c 20 28 76 6f 69 64 2a 29 26  P_SIZE, (void*)&
c050: 6d 61 78 29 3b 0a 20 20 20 20 69 66 28 20 6e 45  max);.    if( nE
c060: 78 74 65 6e 64 3e 30 20 29 7b 0a 20 20 20 20 20  xtend>0 ){.     
c070: 20 76 64 62 65 53 6f 72 74 65 72 45 78 74 65 6e   vdbeSorterExten
c080: 64 46 69 6c 65 28 64 62 2c 20 2a 70 70 46 64 2c  dFile(db, *ppFd,
c090: 20 6e 45 78 74 65 6e 64 29 3b 0a 20 20 20 20 7d   nExtend);.    }
c0a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c0b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74  ;.}../*.** If it
c0c0: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
c0d0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
c0e0: 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 55 6e   allocate the Un
c0f0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 0a 2a 2a  packedRecord .**
c100: 20 73 74 72 75 63 74 75 72 65 20 61 74 20 70 54   structure at pT
c110: 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 2e 20  ask->pUnpacked. 
c120: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
c130: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 28   if successful (
c140: 6f 72 20 0a 2a 2a 20 69 66 20 6e 6f 20 61 6c 6c  or .** if no all
c150: 6f 63 61 74 69 6f 6e 20 77 61 73 20 72 65 71 75  ocation was requ
c160: 69 72 65 64 29 2c 20 6f 72 20 53 51 4c 49 54 45  ired), or SQLITE
c170: 5f 4e 4f 4d 45 4d 20 6f 74 68 65 72 77 69 73 65  _NOMEM otherwise
c180: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c190: 76 64 62 65 53 6f 72 74 41 6c 6c 6f 63 55 6e 70  vdbeSortAllocUnp
c1a0: 61 63 6b 65 64 28 53 6f 72 74 53 75 62 74 61 73  acked(SortSubtas
c1b0: 6b 20 2a 70 54 61 73 6b 29 7b 0a 20 20 69 66 28  k *pTask){.  if(
c1c0: 20 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65   pTask->pUnpacke
c1d0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 73  d==0 ){.    pTas
c1e0: 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 20 3d 20 73  k->pUnpacked = s
c1f0: 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
c200: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 54  npackedRecord(pT
c210: 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 70 4b  ask->pSorter->pK
c220: 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28  eyInfo);.    if(
c230: 20 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65   pTask->pUnpacke
c240: 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  d==0 ) return SQ
c250: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
c260: 0a 20 20 20 20 70 54 61 73 6b 2d 3e 70 55 6e 70  .    pTask->pUnp
c270: 61 63 6b 65 64 2d 3e 6e 46 69 65 6c 64 20 3d 20  acked->nField = 
c280: 70 54 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e  pTask->pSorter->
c290: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
c2a0: 3b 0a 20 20 20 20 70 54 61 73 6b 2d 3e 70 55 6e  ;.    pTask->pUn
c2b0: 70 61 63 6b 65 64 2d 3e 65 72 72 43 6f 64 65 20  packed->errCode 
c2c0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
c2d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c2e0: 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 68 65  ./*.** Merge the
c2f0: 20 74 77 6f 20 73 6f 72 74 65 64 20 6c 69 73 74   two sorted list
c300: 73 20 70 31 20 61 6e 64 20 70 32 20 69 6e 74 6f  s p1 and p2 into
c310: 20 61 20 73 69 6e 67 6c 65 20 6c 69 73 74 2e 0a   a single list..
c320: 2a 2f 0a 73 74 61 74 69 63 20 53 6f 72 74 65 72  */.static Sorter
c330: 52 65 63 6f 72 64 20 2a 76 64 62 65 53 6f 72 74  Record *vdbeSort
c340: 65 72 4d 65 72 67 65 28 0a 20 20 53 6f 72 74 53  erMerge(.  SortS
c350: 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c 20 20  ubtask *pTask,  
c360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61             /* Ca
c370: 6c 6c 69 6e 67 20 74 68 72 65 61 64 20 63 6f 6e  lling thread con
c380: 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72 74 65 72  text */.  Sorter
c390: 52 65 63 6f 72 64 20 2a 70 31 2c 20 20 20 20 20  Record *p1,     
c3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
c3b0: 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65  st list to merge
c3c0: 20 2a 2f 0a 20 20 53 6f 72 74 65 72 52 65 63 6f   */.  SorterReco
c3d0: 72 64 20 2a 70 32 20 20 20 20 20 20 20 20 20 20  rd *p2          
c3e0: 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20        /* Second 
c3f0: 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f  list to merge */
c400: 0a 29 7b 0a 20 20 53 6f 72 74 65 72 52 65 63 6f  .){.  SorterReco
c410: 72 64 20 2a 70 46 69 6e 61 6c 20 3d 20 30 3b 0a  rd *pFinal = 0;.
c420: 20 20 53 6f 72 74 65 72 52 65 63 6f 72 64 20 2a    SorterRecord *
c430: 2a 70 70 20 3d 20 26 70 46 69 6e 61 6c 3b 0a 20  *pp = &pFinal;. 
c440: 20 69 6e 74 20 62 43 61 63 68 65 64 20 3d 20 30   int bCached = 0
c450: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 31 21  ;..  assert( p1!
c460: 3d 30 20 26 26 20 70 32 21 3d 30 20 29 3b 0a 20  =0 && p2!=0 );. 
c470: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
c480: 74 20 72 65 73 3b 0a 20 20 20 20 72 65 73 20 3d  t res;.    res =
c490: 20 70 54 61 73 6b 2d 3e 78 43 6f 6d 70 61 72 65   pTask->xCompare
c4a0: 28 0a 20 20 20 20 20 20 20 20 70 54 61 73 6b 2c  (.        pTask,
c4b0: 20 26 62 43 61 63 68 65 64 2c 20 53 52 56 41 4c   &bCached, SRVAL
c4c0: 28 70 31 29 2c 20 70 31 2d 3e 6e 56 61 6c 2c 20  (p1), p1->nVal, 
c4d0: 53 52 56 41 4c 28 70 32 29 2c 20 70 32 2d 3e 6e  SRVAL(p2), p2->n
c4e0: 56 61 6c 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20  Val.    );..    
c4f0: 69 66 28 20 72 65 73 3c 3d 30 20 29 7b 0a 20 20  if( res<=0 ){.  
c500: 20 20 20 20 2a 70 70 20 3d 20 70 31 3b 0a 20 20      *pp = p1;.  
c510: 20 20 20 20 70 70 20 3d 20 26 70 31 2d 3e 75 2e      pp = &p1->u.
c520: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 31 20  pNext;.      p1 
c530: 3d 20 70 31 2d 3e 75 2e 70 4e 65 78 74 3b 0a 20  = p1->u.pNext;. 
c540: 20 20 20 20 20 69 66 28 20 70 31 3d 3d 30 20 29       if( p1==0 )
c550: 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20  {.        *pp = 
c560: 70 32 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  p2;.        brea
c570: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
c580: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 20  else{.      *pp 
c590: 3d 20 70 32 3b 0a 20 20 20 20 20 20 70 70 20 3d  = p2;.      pp =
c5a0: 20 26 70 32 2d 3e 75 2e 70 4e 65 78 74 3b 0a 20   &p2->u.pNext;. 
c5b0: 20 20 20 20 20 70 32 20 3d 20 70 32 2d 3e 75 2e       p2 = p2->u.
c5c0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 62 43 61  pNext;.      bCa
c5d0: 63 68 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  ched = 0;.      
c5e0: 69 66 28 20 70 32 3d 3d 30 20 29 7b 0a 20 20 20  if( p2==0 ){.   
c5f0: 20 20 20 20 20 2a 70 70 20 3d 20 70 31 3b 0a 20       *pp = p1;. 
c600: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c610: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c620: 20 20 72 65 74 75 72 6e 20 70 46 69 6e 61 6c 3b    return pFinal;
c630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
c640: 20 74 68 65 20 53 6f 72 74 65 72 43 6f 6d 70 61   the SorterCompa
c650: 72 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63  re function to c
c660: 6f 6d 70 61 72 65 20 76 61 6c 75 65 73 20 63 6f  ompare values co
c670: 6c 6c 65 63 74 65 64 20 62 79 20 74 68 65 0a 2a  llected by the.*
c680: 2a 20 73 6f 72 74 65 72 20 6f 62 6a 65 63 74 20  * sorter object 
c690: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
c6a0: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
c6b0: 73 74 61 74 69 63 20 53 6f 72 74 65 72 43 6f 6d  static SorterCom
c6c0: 70 61 72 65 20 76 64 62 65 53 6f 72 74 65 72 47  pare vdbeSorterG
c6d0: 65 74 43 6f 6d 70 61 72 65 28 56 64 62 65 53 6f  etCompare(VdbeSo
c6e0: 72 74 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  rter *p){.  if( 
c6f0: 70 2d 3e 74 79 70 65 4d 61 73 6b 3d 3d 53 4f 52  p->typeMask==SOR
c700: 54 45 52 5f 54 59 50 45 5f 49 4e 54 45 47 45 52  TER_TYPE_INTEGER
c710: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 76   ){.    return v
c720: 64 62 65 53 6f 72 74 65 72 43 6f 6d 70 61 72 65  dbeSorterCompare
c730: 49 6e 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Int;.  }else if(
c740: 20 70 2d 3e 74 79 70 65 4d 61 73 6b 3d 3d 53 4f   p->typeMask==SO
c750: 52 54 45 52 5f 54 59 50 45 5f 54 45 58 54 20 29  RTER_TYPE_TEXT )
c760: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 76 64 62  {.    return vdb
c770: 65 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 54 65  eSorterCompareTe
c780: 78 74 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  xt; .  }.  retur
c790: 6e 20 76 64 62 65 53 6f 72 74 65 72 43 6f 6d 70  n vdbeSorterComp
c7a0: 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f  are;.}../*.** So
c7b0: 72 74 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  rt the linked li
c7c0: 73 74 20 6f 66 20 72 65 63 6f 72 64 73 20 68 65  st of records he
c7d0: 61 64 65 64 20 61 74 20 70 54 61 73 6b 2d 3e 70  aded at pTask->p
c7e0: 4c 69 73 74 2e 20 52 65 74 75 72 6e 20 0a 2a 2a  List. Return .**
c7f0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
c800: 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
c810: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
c820: 65 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 4e  e (i.e. SQLITE_N
c830: 4f 4d 45 4d 29 20 69 66 20 0a 2a 2a 20 61 6e 20  OMEM) if .** an 
c840: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
c850: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
c860: 53 6f 72 74 65 72 53 6f 72 74 28 53 6f 72 74 53  SorterSort(SortS
c870: 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c 20 53  ubtask *pTask, S
c880: 6f 72 74 65 72 4c 69 73 74 20 2a 70 4c 69 73 74  orterList *pList
c890: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 6f  ){.  int i;.  So
c8a0: 72 74 65 72 52 65 63 6f 72 64 20 2a 2a 61 53 6c  rterRecord **aSl
c8b0: 6f 74 3b 0a 20 20 53 6f 72 74 65 72 52 65 63 6f  ot;.  SorterReco
c8c0: 72 64 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 3b  rd *p;.  int rc;
c8d0: 0a 0a 20 20 72 63 20 3d 20 76 64 62 65 53 6f 72  ..  rc = vdbeSor
c8e0: 74 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 28 70  tAllocUnpacked(p
c8f0: 54 61 73 6b 29 3b 0a 20 20 69 66 28 20 72 63 21  Task);.  if( rc!
c900: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
c910: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 20 3d 20 70  urn rc;..  p = p
c920: 4c 69 73 74 2d 3e 70 4c 69 73 74 3b 0a 20 20 70  List->pList;.  p
c930: 54 61 73 6b 2d 3e 78 43 6f 6d 70 61 72 65 20 3d  Task->xCompare =
c940: 20 76 64 62 65 53 6f 72 74 65 72 47 65 74 43 6f   vdbeSorterGetCo
c950: 6d 70 61 72 65 28 70 54 61 73 6b 2d 3e 70 53 6f  mpare(pTask->pSo
c960: 72 74 65 72 29 3b 0a 0a 20 20 61 53 6c 6f 74 20  rter);..  aSlot 
c970: 3d 20 28 53 6f 72 74 65 72 52 65 63 6f 72 64 20  = (SorterRecord 
c980: 2a 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  **)sqlite3Malloc
c990: 5a 65 72 6f 28 36 34 20 2a 20 73 69 7a 65 6f 66  Zero(64 * sizeof
c9a0: 28 53 6f 72 74 65 72 52 65 63 6f 72 64 20 2a 29  (SorterRecord *)
c9b0: 29 3b 0a 20 20 69 66 28 20 21 61 53 6c 6f 74 20  );.  if( !aSlot 
c9c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c9d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
c9e0: 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70  .  }..  while( p
c9f0: 20 29 7b 0a 20 20 20 20 53 6f 72 74 65 72 52 65   ){.    SorterRe
ca00: 63 6f 72 64 20 2a 70 4e 65 78 74 3b 0a 20 20 20  cord *pNext;.   
ca10: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 4d 65 6d   if( pList->aMem
ca20: 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ory ){.      if(
ca30: 20 28 75 38 2a 29 70 3d 3d 70 4c 69 73 74 2d 3e   (u8*)p==pList->
ca40: 61 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  aMemory ){.     
ca50: 20 20 20 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20     pNext = 0;.  
ca60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ca70: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75 2e     assert( p->u.
ca80: 69 4e 65 78 74 3c 73 71 6c 69 74 65 33 4d 61 6c  iNext<sqlite3Mal
ca90: 6c 6f 63 53 69 7a 65 28 70 4c 69 73 74 2d 3e 61  locSize(pList->a
caa0: 4d 65 6d 6f 72 79 29 20 29 3b 0a 20 20 20 20 20  Memory) );.     
cab0: 20 20 20 70 4e 65 78 74 20 3d 20 28 53 6f 72 74     pNext = (Sort
cac0: 65 72 52 65 63 6f 72 64 2a 29 26 70 4c 69 73 74  erRecord*)&pList
cad0: 2d 3e 61 4d 65 6d 6f 72 79 5b 70 2d 3e 75 2e 69  ->aMemory[p->u.i
cae0: 4e 65 78 74 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  Next];.      }. 
caf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cb00: 70 4e 65 78 74 20 3d 20 70 2d 3e 75 2e 70 4e 65  pNext = p->u.pNe
cb10: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  xt;.    }..    p
cb20: 2d 3e 75 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ->u.pNext = 0;. 
cb30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 53 6c 6f     for(i=0; aSlo
cb40: 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  t[i]; i++){.    
cb50: 20 20 70 20 3d 20 76 64 62 65 53 6f 72 74 65 72    p = vdbeSorter
cb60: 4d 65 72 67 65 28 70 54 61 73 6b 2c 20 70 2c 20  Merge(pTask, p, 
cb70: 61 53 6c 6f 74 5b 69 5d 29 3b 0a 20 20 20 20 20  aSlot[i]);.     
cb80: 20 61 53 6c 6f 74 5b 69 5d 20 3d 20 30 3b 0a 20   aSlot[i] = 0;. 
cb90: 20 20 20 7d 0a 20 20 20 20 61 53 6c 6f 74 5b 69     }.    aSlot[i
cba0: 5d 20 3d 20 70 3b 0a 20 20 20 20 70 20 3d 20 70  ] = p;.    p = p
cbb0: 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  Next;.  }..  p =
cbc0: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
cbd0: 3c 36 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  <64; i++){.    i
cbe0: 66 28 20 61 53 6c 6f 74 5b 69 5d 3d 3d 30 20 29  f( aSlot[i]==0 )
cbf0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
cc00: 20 3d 20 70 20 3f 20 76 64 62 65 53 6f 72 74 65   = p ? vdbeSorte
cc10: 72 4d 65 72 67 65 28 70 54 61 73 6b 2c 20 70 2c  rMerge(pTask, p,
cc20: 20 61 53 6c 6f 74 5b 69 5d 29 20 3a 20 61 53 6c   aSlot[i]) : aSl
cc30: 6f 74 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 4c 69  ot[i];.  }.  pLi
cc40: 73 74 2d 3e 70 4c 69 73 74 20 3d 20 70 3b 0a 0a  st->pList = p;..
cc50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
cc60: 53 6c 6f 74 29 3b 0a 20 20 61 73 73 65 72 74 28  Slot);.  assert(
cc70: 20 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65   pTask->pUnpacke
cc80: 64 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  d->errCode==SQLI
cc90: 54 45 5f 4f 4b 20 0a 20 20 20 20 20 20 20 7c 7c  TE_OK .       ||
cca0: 20 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65   pTask->pUnpacke
ccb0: 64 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  d->errCode==SQLI
ccc0: 54 45 5f 4e 4f 4d 45 4d 20 0a 20 20 29 3b 0a 20  TE_NOMEM .  );. 
ccd0: 20 72 65 74 75 72 6e 20 70 54 61 73 6b 2d 3e 70   return pTask->p
cce0: 55 6e 70 61 63 6b 65 64 2d 3e 65 72 72 43 6f 64  Unpacked->errCod
ccf0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  e;.}../*.** Init
cd00: 69 61 6c 69 7a 65 20 61 20 50 4d 41 2d 77 72 69  ialize a PMA-wri
cd10: 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ter object..*/.s
cd20: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 50  tatic void vdbeP
cd30: 6d 61 57 72 69 74 65 72 49 6e 69 74 28 0a 20 20  maWriterInit(.  
cd40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
cd50: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
cd60: 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 74  /* File handle t
cd70: 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
cd80: 50 6d 61 57 72 69 74 65 72 20 2a 70 2c 20 20 20  PmaWriter *p,   
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cda0: 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70  /* Object to pop
cdb0: 75 6c 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ulate */.  int n
cdc0: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
cdd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
cde0: 66 66 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69  ffer size */.  i
cdf0: 36 34 20 69 53 74 61 72 74 20 20 20 20 20 20 20  64 iStart       
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ce10: 2a 20 4f 66 66 73 65 74 20 6f 66 20 70 46 64 20  * Offset of pFd 
ce20: 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67  to begin writing
ce30: 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 6d 65 6d 73   at */.){.  mems
ce40: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
ce50: 50 6d 61 57 72 69 74 65 72 29 29 3b 0a 20 20 70  PmaWriter));.  p
ce60: 2d 3e 61 42 75 66 66 65 72 20 3d 20 28 75 38 2a  ->aBuffer = (u8*
ce70: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e  )sqlite3Malloc(n
ce80: 42 75 66 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  Buf);.  if( !p->
ce90: 61 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 70  aBuffer ){.    p
cea0: 2d 3e 65 46 57 45 72 72 20 3d 20 53 51 4c 49 54  ->eFWErr = SQLIT
ceb0: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
cec0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 69 42  }else{.    p->iB
ced0: 75 66 45 6e 64 20 3d 20 70 2d 3e 69 42 75 66 53  ufEnd = p->iBufS
cee0: 74 61 72 74 20 3d 20 28 69 53 74 61 72 74 20 25  tart = (iStart %
cef0: 20 6e 42 75 66 29 3b 0a 20 20 20 20 70 2d 3e 69   nBuf);.    p->i
cf00: 57 72 69 74 65 4f 66 66 20 3d 20 69 53 74 61 72  WriteOff = iStar
cf10: 74 20 2d 20 70 2d 3e 69 42 75 66 53 74 61 72 74  t - p->iBufStart
cf20: 3b 0a 20 20 20 20 70 2d 3e 6e 42 75 66 66 65 72  ;.    p->nBuffer
cf30: 20 3d 20 6e 42 75 66 3b 0a 20 20 20 20 70 2d 3e   = nBuf;.    p->
cf40: 70 46 64 20 3d 20 70 46 64 3b 0a 20 20 7d 0a 7d  pFd = pFd;.  }.}
cf50: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 44  ../*.** Write nD
cf60: 61 74 61 20 62 79 74 65 73 20 6f 66 20 64 61 74  ata bytes of dat
cf70: 61 20 74 6f 20 74 68 65 20 50 4d 41 2e 20 52 65  a to the PMA. Re
cf80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
cf90: 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * if successful,
cfa0: 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
cfb0: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
cfc0: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
cfd0: 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
cfe0: 50 6d 61 57 72 69 74 65 42 6c 6f 62 28 50 6d 61  PmaWriteBlob(Pma
cff0: 57 72 69 74 65 72 20 2a 70 2c 20 75 38 20 2a 70  Writer *p, u8 *p
d000: 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
d010: 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e  {.  int nRem = n
d020: 44 61 74 61 3b 0a 20 20 77 68 69 6c 65 28 20 6e  Data;.  while( n
d030: 52 65 6d 3e 30 20 26 26 20 70 2d 3e 65 46 57 45  Rem>0 && p->eFWE
d040: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  rr==0 ){.    int
d050: 20 6e 43 6f 70 79 20 3d 20 6e 52 65 6d 3b 0a 20   nCopy = nRem;. 
d060: 20 20 20 69 66 28 20 6e 43 6f 70 79 3e 28 70 2d     if( nCopy>(p-
d070: 3e 6e 42 75 66 66 65 72 20 2d 20 70 2d 3e 69 42  >nBuffer - p->iB
d080: 75 66 45 6e 64 29 20 29 7b 0a 20 20 20 20 20 20  ufEnd) ){.      
d090: 6e 43 6f 70 79 20 3d 20 70 2d 3e 6e 42 75 66 66  nCopy = p->nBuff
d0a0: 65 72 20 2d 20 70 2d 3e 69 42 75 66 45 6e 64 3b  er - p->iBufEnd;
d0b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 6d 63  .    }..    memc
d0c0: 70 79 28 26 70 2d 3e 61 42 75 66 66 65 72 5b 70  py(&p->aBuffer[p
d0d0: 2d 3e 69 42 75 66 45 6e 64 5d 2c 20 26 70 44 61  ->iBufEnd], &pDa
d0e0: 74 61 5b 6e 44 61 74 61 2d 6e 52 65 6d 5d 2c 20  ta[nData-nRem], 
d0f0: 6e 43 6f 70 79 29 3b 0a 20 20 20 20 70 2d 3e 69  nCopy);.    p->i
d100: 42 75 66 45 6e 64 20 2b 3d 20 6e 43 6f 70 79 3b  BufEnd += nCopy;
d110: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 42 75 66  .    if( p->iBuf
d120: 45 6e 64 3d 3d 70 2d 3e 6e 42 75 66 66 65 72 20  End==p->nBuffer 
d130: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 46 57 45  ){.      p->eFWE
d140: 72 72 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rr = sqlite3OsWr
d150: 69 74 65 28 70 2d 3e 70 46 64 2c 20 0a 20 20 20  ite(p->pFd, .   
d160: 20 20 20 20 20 20 20 26 70 2d 3e 61 42 75 66 66         &p->aBuff
d170: 65 72 5b 70 2d 3e 69 42 75 66 53 74 61 72 74 5d  er[p->iBufStart]
d180: 2c 20 70 2d 3e 69 42 75 66 45 6e 64 20 2d 20 70  , p->iBufEnd - p
d190: 2d 3e 69 42 75 66 53 74 61 72 74 2c 20 0a 20 20  ->iBufStart, .  
d1a0: 20 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74          p->iWrit
d1b0: 65 4f 66 66 20 2b 20 70 2d 3e 69 42 75 66 53 74  eOff + p->iBufSt
d1c0: 61 72 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  art.      );.   
d1d0: 20 20 20 70 2d 3e 69 42 75 66 53 74 61 72 74 20     p->iBufStart 
d1e0: 3d 20 70 2d 3e 69 42 75 66 45 6e 64 20 3d 20 30  = p->iBufEnd = 0
d1f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74  ;.      p->iWrit
d200: 65 4f 66 66 20 2b 3d 20 70 2d 3e 6e 42 75 66 66  eOff += p->nBuff
d210: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  er;.    }.    as
d220: 73 65 72 74 28 20 70 2d 3e 69 42 75 66 45 6e 64  sert( p->iBufEnd
d230: 3c 70 2d 3e 6e 42 75 66 66 65 72 20 29 3b 0a 0a  <p->nBuffer );..
d240: 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43 6f 70      nRem -= nCop
d250: 79 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  y;.  }.}../*.** 
d260: 46 6c 75 73 68 20 61 6e 79 20 62 75 66 66 65 72  Flush any buffer
d270: 65 64 20 64 61 74 61 20 74 6f 20 64 69 73 6b 20  ed data to disk 
d280: 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74 68 65  and clean up the
d290: 20 50 4d 41 2d 77 72 69 74 65 72 20 6f 62 6a 65   PMA-writer obje
d2a0: 63 74 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  ct..** The resul
d2b0: 74 73 20 6f 66 20 75 73 69 6e 67 20 74 68 65 20  ts of using the 
d2c0: 50 4d 41 2d 77 72 69 74 65 72 20 61 66 74 65 72  PMA-writer after
d2d0: 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20 75   this call are u
d2e0: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 20 52 65 74  ndefined..** Ret
d2f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
d300: 20 66 6c 75 73 68 69 6e 67 20 74 68 65 20 62 75   flushing the bu
d310: 66 66 65 72 65 64 20 64 61 74 61 20 73 75 63 63  ffered data succ
d320: 65 65 64 73 20 6f 72 20 69 73 20 6e 6f 74 20 0a  eeds or is not .
d330: 2a 2a 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68  ** required. Oth
d340: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
d350: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
d360: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  ode..**.** Befor
d370: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74  e returning, set
d380: 20 2a 70 69 45 6f 66 20 74 6f 20 74 68 65 20 6f   *piEof to the o
d390: 66 66 73 65 74 20 69 6d 6d 65 64 69 61 74 65 6c  ffset immediatel
d3a0: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a  y following the.
d3b0: 2a 2a 20 6c 61 73 74 20 62 79 74 65 20 77 72 69  ** last byte wri
d3c0: 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
d3d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d3e0: 76 64 62 65 50 6d 61 57 72 69 74 65 72 46 69 6e  vdbePmaWriterFin
d3f0: 69 73 68 28 50 6d 61 57 72 69 74 65 72 20 2a 70  ish(PmaWriter *p
d400: 2c 20 69 36 34 20 2a 70 69 45 6f 66 29 7b 0a 20  , i64 *piEof){. 
d410: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
d420: 2d 3e 65 46 57 45 72 72 3d 3d 30 20 26 26 20 41  ->eFWErr==0 && A
d430: 4c 57 41 59 53 28 70 2d 3e 61 42 75 66 66 65 72  LWAYS(p->aBuffer
d440: 29 20 26 26 20 70 2d 3e 69 42 75 66 45 6e 64 3e  ) && p->iBufEnd>
d450: 70 2d 3e 69 42 75 66 53 74 61 72 74 20 29 7b 0a  p->iBufStart ){.
d460: 20 20 20 20 70 2d 3e 65 46 57 45 72 72 20 3d 20      p->eFWErr = 
d470: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
d480: 2d 3e 70 46 64 2c 20 0a 20 20 20 20 20 20 20 20  ->pFd, .        
d490: 26 70 2d 3e 61 42 75 66 66 65 72 5b 70 2d 3e 69  &p->aBuffer[p->i
d4a0: 42 75 66 53 74 61 72 74 5d 2c 20 70 2d 3e 69 42  BufStart], p->iB
d4b0: 75 66 45 6e 64 20 2d 20 70 2d 3e 69 42 75 66 53  ufEnd - p->iBufS
d4c0: 74 61 72 74 2c 20 0a 20 20 20 20 20 20 20 20 70  tart, .        p
d4d0: 2d 3e 69 57 72 69 74 65 4f 66 66 20 2b 20 70 2d  ->iWriteOff + p-
d4e0: 3e 69 42 75 66 53 74 61 72 74 0a 20 20 20 20 29  >iBufStart.    )
d4f0: 3b 0a 20 20 7d 0a 20 20 2a 70 69 45 6f 66 20 3d  ;.  }.  *piEof =
d500: 20 28 70 2d 3e 69 57 72 69 74 65 4f 66 66 20 2b   (p->iWriteOff +
d510: 20 70 2d 3e 69 42 75 66 45 6e 64 29 3b 0a 20 20   p->iBufEnd);.  
d520: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
d530: 61 42 75 66 66 65 72 29 3b 0a 20 20 72 63 20 3d  aBuffer);.  rc =
d540: 20 70 2d 3e 65 46 57 45 72 72 3b 0a 20 20 6d 65   p->eFWErr;.  me
d550: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
d560: 66 28 50 6d 61 57 72 69 74 65 72 29 29 3b 0a 20  f(PmaWriter));. 
d570: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
d580: 2a 0a 2a 2a 20 57 72 69 74 65 20 76 61 6c 75 65  *.** Write value
d590: 20 69 56 61 6c 20 65 6e 63 6f 64 65 64 20 61 73   iVal encoded as
d5a0: 20 61 20 76 61 72 69 6e 74 20 74 6f 20 74 68 65   a varint to the
d5b0: 20 50 4d 41 2e 20 52 65 74 75 72 6e 20 0a 2a 2a   PMA. Return .**
d5c0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
d5d0: 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
d5e0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
d5f0: 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  e if an error oc
d600: 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
d610: 76 6f 69 64 20 76 64 62 65 50 6d 61 57 72 69 74  void vdbePmaWrit
d620: 65 56 61 72 69 6e 74 28 50 6d 61 57 72 69 74 65  eVarint(PmaWrite
d630: 72 20 2a 70 2c 20 75 36 34 20 69 56 61 6c 29 7b  r *p, u64 iVal){
d640: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 0a 20  .  int nByte; . 
d650: 20 75 38 20 61 42 79 74 65 5b 31 30 5d 3b 0a 20   u8 aByte[10];. 
d660: 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33   nByte = sqlite3
d670: 50 75 74 56 61 72 69 6e 74 28 61 42 79 74 65 2c  PutVarint(aByte,
d680: 20 69 56 61 6c 29 3b 0a 20 20 76 64 62 65 50 6d   iVal);.  vdbePm
d690: 61 57 72 69 74 65 42 6c 6f 62 28 70 2c 20 61 42  aWriteBlob(p, aB
d6a0: 79 74 65 2c 20 6e 42 79 74 65 29 3b 0a 7d 0a 0a  yte, nByte);.}..
d6b0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
d6c0: 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
d6d0: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 6c 69   of in-memory li
d6e0: 6e 6b 65 64 2d 6c 69 73 74 20 70 4c 69 73 74 20  nked-list pList 
d6f0: 74 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20  to a level-0.** 
d700: 50 4d 41 20 69 6e 20 74 68 65 20 74 65 6d 70 20  PMA in the temp 
d710: 66 69 6c 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  file belonging t
d720: 6f 20 73 75 62 2d 74 61 73 6b 20 70 54 61 73 6b  o sub-task pTask
d730: 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
d740: 4f 4b 20 69 66 20 0a 2a 2a 20 73 75 63 63 65 73  OK if .** succes
d750: 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
d760: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
d770: 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  herwise..**.** T
d780: 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 61 20 50  he format of a P
d790: 4d 41 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  MA is:.**.**    
d7a0: 20 2a 20 41 20 76 61 72 69 6e 74 2e 20 54 68 69   * A varint. Thi
d7b0: 73 20 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e  s varint contain
d7c0: 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
d7d0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
d7e0: 6f 6e 74 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  ontent.**       
d7f0: 69 6e 20 74 68 65 20 50 4d 41 20 28 6e 6f 74 20  in the PMA (not 
d800: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 76 61  including the va
d810: 72 69 6e 74 20 69 74 73 65 6c 66 29 2e 0a 2a 2a  rint itself)..**
d820: 0a 2a 2a 20 20 20 20 20 2a 20 4f 6e 65 20 6f 72  .**     * One or
d830: 20 6d 6f 72 65 20 72 65 63 6f 72 64 73 20 70 61   more records pa
d840: 63 6b 65 64 20 65 6e 64 2d 74 6f 2d 65 6e 64 20  cked end-to-end 
d850: 69 6e 20 6f 72 64 65 72 20 6f 66 20 61 73 63 65  in order of asce
d860: 6e 64 69 6e 67 20 6b 65 79 73 2e 20 0a 2a 2a 20  nding keys. .** 
d870: 20 20 20 20 20 20 45 61 63 68 20 72 65 63 6f 72        Each recor
d880: 64 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  d consists of a 
d890: 76 61 72 69 6e 74 20 66 6f 6c 6c 6f 77 65 64 20  varint followed 
d8a0: 62 79 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  by a blob of dat
d8b0: 61 20 28 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  a (the .**      
d8c0: 20 6b 65 79 29 2e 20 54 68 65 20 76 61 72 69 6e   key). The varin
d8d0: 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
d8e0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
d8f0: 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 0a 2a 2f  blob of data..*/
d900: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
d910: 53 6f 72 74 65 72 4c 69 73 74 54 6f 50 4d 41 28  SorterListToPMA(
d920: 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61  SortSubtask *pTa
d930: 73 6b 2c 20 53 6f 72 74 65 72 4c 69 73 74 20 2a  sk, SorterList *
d940: 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65  pList){.  sqlite
d950: 33 20 2a 64 62 20 3d 20 70 54 61 73 6b 2d 3e 70  3 *db = pTask->p
d960: 53 6f 72 74 65 72 2d 3e 64 62 3b 0a 20 20 69 6e  Sorter->db;.  in
d970: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d980: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
d990: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
d9a0: 20 20 50 6d 61 57 72 69 74 65 72 20 77 72 69 74    PmaWriter writ
d9b0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
d9c0: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 75 73 65 64    /* Object used
d9d0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
d9e0: 20 66 69 6c 65 20 2a 2f 0a 0a 23 69 66 64 65 66   file */..#ifdef
d9f0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
da00: 2f 2a 20 53 65 74 20 69 53 7a 20 74 6f 20 74 68  /* Set iSz to th
da10: 65 20 65 78 70 65 63 74 65 64 20 73 69 7a 65 20  e expected size 
da20: 6f 66 20 66 69 6c 65 20 70 54 61 73 6b 2d 3e 66  of file pTask->f
da30: 69 6c 65 20 61 66 74 65 72 20 77 72 69 74 69 6e  ile after writin
da40: 67 20 74 68 65 20 50 4d 41 2e 20 0a 20 20 2a 2a  g the PMA. .  **
da50: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
da60: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
da70: 74 65 6d 65 6e 74 20 61 74 20 74 68 65 20 65 6e  tement at the en
da80: 64 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  d of this functi
da90: 6f 6e 2e 20 20 2a 2f 0a 20 20 69 36 34 20 69 53  on.  */.  i64 iS
daa0: 7a 20 3d 20 70 4c 69 73 74 2d 3e 73 7a 50 4d 41  z = pList->szPMA
dab0: 20 2b 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74   + sqlite3Varint
dac0: 4c 65 6e 28 70 4c 69 73 74 2d 3e 73 7a 50 4d 41  Len(pList->szPMA
dad0: 29 20 2b 20 70 54 61 73 6b 2d 3e 66 69 6c 65 2e  ) + pTask->file.
dae0: 69 45 6f 66 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  iEof;.#endif..  
daf0: 76 64 62 65 53 6f 72 74 65 72 57 6f 72 6b 44 65  vdbeSorterWorkDe
db00: 62 75 67 28 70 54 61 73 6b 2c 20 22 65 6e 74 65  bug(pTask, "ente
db10: 72 22 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r");.  memset(&w
db20: 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
db30: 28 50 6d 61 57 72 69 74 65 72 29 29 3b 0a 20 20  (PmaWriter));.  
db40: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 73  assert( pList->s
db50: 7a 50 4d 41 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  zPMA>0 );..  /* 
db60: 49 66 20 74 68 65 20 66 69 72 73 74 20 74 65 6d  If the first tem
db70: 70 6f 72 61 72 79 20 50 4d 41 20 66 69 6c 65 20  porary PMA file 
db80: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6f 70 65  has not been ope
db90: 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
dba0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 73 6b  . */.  if( pTask
dbb0: 2d 3e 66 69 6c 65 2e 70 46 64 3d 3d 30 20 29 7b  ->file.pFd==0 ){
dbc0: 0a 20 20 20 20 72 63 20 3d 20 76 64 62 65 53 6f  .    rc = vdbeSo
dbd0: 72 74 65 72 4f 70 65 6e 54 65 6d 70 46 69 6c 65  rterOpenTempFile
dbe0: 28 64 62 2c 20 30 2c 20 26 70 54 61 73 6b 2d 3e  (db, 0, &pTask->
dbf0: 66 69 6c 65 2e 70 46 64 29 3b 0a 20 20 20 20 61  file.pFd);.    a
dc00: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
dc10: 45 5f 4f 4b 20 7c 7c 20 70 54 61 73 6b 2d 3e 66  E_OK || pTask->f
dc20: 69 6c 65 2e 70 46 64 20 29 3b 0a 20 20 20 20 61  ile.pFd );.    a
dc30: 73 73 65 72 74 28 20 70 54 61 73 6b 2d 3e 66 69  ssert( pTask->fi
dc40: 6c 65 2e 69 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  le.iEof==0 );.  
dc50: 20 20 61 73 73 65 72 74 28 20 70 54 61 73 6b 2d    assert( pTask-
dc60: 3e 6e 50 4d 41 3d 3d 30 20 29 3b 0a 20 20 7d 0a  >nPMA==0 );.  }.
dc70: 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 67 65 74  .  /* Try to get
dc80: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6d 65 6d   the file to mem
dc90: 6f 72 79 20 6d 61 70 20 2a 2f 0a 20 20 69 66 28  ory map */.  if(
dca0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
dcb0: 7b 0a 20 20 20 20 76 64 62 65 53 6f 72 74 65 72  {.    vdbeSorter
dcc0: 45 78 74 65 6e 64 46 69 6c 65 28 64 62 2c 20 70  ExtendFile(db, p
dcd0: 54 61 73 6b 2d 3e 66 69 6c 65 2e 70 46 64 2c 20  Task->file.pFd, 
dce0: 70 54 61 73 6b 2d 3e 66 69 6c 65 2e 69 45 6f 66  pTask->file.iEof
dcf0: 2b 70 4c 69 73 74 2d 3e 73 7a 50 4d 41 2b 39 29  +pList->szPMA+9)
dd00: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 6f 72 74  ;.  }..  /* Sort
dd10: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69   the list */.  i
dd20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
dd30: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 76 64 62   ){.    rc = vdb
dd40: 65 53 6f 72 74 65 72 53 6f 72 74 28 70 54 61 73  eSorterSort(pTas
dd50: 6b 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  k, pList);.  }..
dd60: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dd70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 53 6f 72 74 65  _OK ){.    Sorte
dd80: 72 52 65 63 6f 72 64 20 2a 70 3b 0a 20 20 20 20  rRecord *p;.    
dd90: 53 6f 72 74 65 72 52 65 63 6f 72 64 20 2a 70 4e  SorterRecord *pN
dda0: 65 78 74 20 3d 20 30 3b 0a 0a 20 20 20 20 76 64  ext = 0;..    vd
ddb0: 62 65 50 6d 61 57 72 69 74 65 72 49 6e 69 74 28  bePmaWriterInit(
ddc0: 70 54 61 73 6b 2d 3e 66 69 6c 65 2e 70 46 64 2c  pTask->file.pFd,
ddd0: 20 26 77 72 69 74 65 72 2c 20 70 54 61 73 6b 2d   &writer, pTask-
dde0: 3e 70 53 6f 72 74 65 72 2d 3e 70 67 73 7a 2c 0a  >pSorter->pgsz,.
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 20 20 20 20 70 54 61 73 6b 2d 3e 66 69 6c        pTask->fil
de10: 65 2e 69 45 6f 66 29 3b 0a 20 20 20 20 70 54 61  e.iEof);.    pTa
de20: 73 6b 2d 3e 6e 50 4d 41 2b 2b 3b 0a 20 20 20 20  sk->nPMA++;.    
de30: 76 64 62 65 50 6d 61 57 72 69 74 65 56 61 72 69  vdbePmaWriteVari
de40: 6e 74 28 26 77 72 69 74 65 72 2c 20 70 4c 69 73  nt(&writer, pLis
de50: 74 2d 3e 73 7a 50 4d 41 29 3b 0a 20 20 20 20 66  t->szPMA);.    f
de60: 6f 72 28 70 3d 70 4c 69 73 74 2d 3e 70 4c 69 73  or(p=pList->pLis
de70: 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a  t; p; p=pNext){.
de80: 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d        pNext = p-
de90: 3e 75 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  >u.pNext;.      
dea0: 76 64 62 65 50 6d 61 57 72 69 74 65 56 61 72 69  vdbePmaWriteVari
deb0: 6e 74 28 26 77 72 69 74 65 72 2c 20 70 2d 3e 6e  nt(&writer, p->n
dec0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 76 64 62 65  Val);.      vdbe
ded0: 50 6d 61 57 72 69 74 65 42 6c 6f 62 28 26 77 72  PmaWriteBlob(&wr
dee0: 69 74 65 72 2c 20 53 52 56 41 4c 28 70 29 2c 20  iter, SRVAL(p), 
def0: 70 2d 3e 6e 56 61 6c 29 3b 0a 20 20 20 20 20 20  p->nVal);.      
df00: 69 66 28 20 70 4c 69 73 74 2d 3e 61 4d 65 6d 6f  if( pList->aMemo
df10: 72 79 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f  ry==0 ) sqlite3_
df20: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a 20  free(p);.    }. 
df30: 20 20 20 70 4c 69 73 74 2d 3e 70 4c 69 73 74 20     pList->pList 
df40: 3d 20 70 3b 0a 20 20 20 20 72 63 20 3d 20 76 64  = p;.    rc = vd
df50: 62 65 50 6d 61 57 72 69 74 65 72 46 69 6e 69 73  bePmaWriterFinis
df60: 68 28 26 77 72 69 74 65 72 2c 20 26 70 54 61 73  h(&writer, &pTas
df70: 6b 2d 3e 66 69 6c 65 2e 69 45 6f 66 29 3b 0a 20  k->file.iEof);. 
df80: 20 7d 0a 0a 20 20 76 64 62 65 53 6f 72 74 65 72   }..  vdbeSorter
df90: 57 6f 72 6b 44 65 62 75 67 28 70 54 61 73 6b 2c  WorkDebug(pTask,
dfa0: 20 22 65 78 69 74 22 29 3b 0a 20 20 61 73 73 65   "exit");.  asse
dfb0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
dfc0: 4b 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 4c 69 73  K || pList->pLis
dfd0: 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t==0 );.  assert
dfe0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
dff0: 7c 7c 20 70 54 61 73 6b 2d 3e 66 69 6c 65 2e 69  || pTask->file.i
e000: 45 6f 66 3d 3d 69 53 7a 20 29 3b 0a 20 20 72 65  Eof==iSz );.  re
e010: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e020: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 4d 65  * Advance the Me
e030: 72 67 65 45 6e 67 69 6e 65 20 74 6f 20 69 74 73  rgeEngine to its
e040: 20 6e 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2a 20   next entry..** 
e050: 53 65 74 20 2a 70 62 45 6f 66 20 74 6f 20 74 72  Set *pbEof to tr
e060: 75 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ue there is no n
e070: 65 78 74 20 65 6e 74 72 79 20 62 65 63 61 75 73  ext entry becaus
e080: 65 0a 2a 2a 20 74 68 65 20 4d 65 72 67 65 45 6e  e.** the MergeEn
e090: 67 69 6e 65 20 68 61 73 20 72 65 61 63 68 65 64  gine has reached
e0a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6c 6c 20   the end of all 
e0b0: 69 74 73 20 69 6e 70 75 74 73 2e 0a 2a 2a 0a 2a  its inputs..**.*
e0c0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
e0d0: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
e0e0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
e0f0: 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  e if an error oc
e100: 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
e110: 69 6e 74 20 76 64 62 65 4d 65 72 67 65 45 6e 67  int vdbeMergeEng
e120: 69 6e 65 53 74 65 70 28 0a 20 20 4d 65 72 67 65  ineStep(.  Merge
e130: 45 6e 67 69 6e 65 20 2a 70 4d 65 72 67 65 72 2c  Engine *pMerger,
e140: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 72        /* The mer
e150: 67 65 20 65 6e 67 69 6e 65 20 74 6f 20 61 64 76  ge engine to adv
e160: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
e170: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   row */.  int *p
e180: 62 45 6f 66 20 20 20 20 20 20 20 20 20 20 20 20  bEof            
e190: 20 20 20 20 20 2f 2a 20 53 65 74 20 54 52 55 45       /* Set TRUE
e1a0: 20 61 74 20 45 4f 46 2e 20 20 53 65 74 20 66 61   at EOF.  Set fa
e1b0: 6c 73 65 20 66 6f 72 20 6d 6f 72 65 20 63 6f 6e  lse for more con
e1c0: 74 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tent */.){.  int
e1d0: 20 72 63 3b 0a 20 20 69 6e 74 20 69 50 72 65 76   rc;.  int iPrev
e1e0: 20 3d 20 70 4d 65 72 67 65 72 2d 3e 61 54 72 65   = pMerger->aTre
e1f0: 65 5b 31 5d 3b 2f 2a 20 49 6e 64 65 78 20 6f 66  e[1];/* Index of
e200: 20 50 6d 61 52 65 61 64 65 72 20 74 6f 20 61 64   PmaReader to ad
e210: 76 61 6e 63 65 20 2a 2f 0a 20 20 53 6f 72 74 53  vance */.  SortS
e220: 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 20 3d 20  ubtask *pTask = 
e230: 70 4d 65 72 67 65 72 2d 3e 70 54 61 73 6b 3b 0a  pMerger->pTask;.
e240: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 68  .  /* Advance th
e250: 65 20 63 75 72 72 65 6e 74 20 50 6d 61 52 65 61  e current PmaRea
e260: 64 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 76 64  der */.  rc = vd
e270: 62 65 50 6d 61 52 65 61 64 65 72 4e 65 78 74 28  bePmaReaderNext(
e280: 26 70 4d 65 72 67 65 72 2d 3e 61 52 65 61 64 72  &pMerger->aReadr
e290: 5b 69 50 72 65 76 5d 29 3b 0a 0a 20 20 2f 2a 20  [iPrev]);..  /* 
e2a0: 55 70 64 61 74 65 20 63 6f 6e 74 65 6e 74 73 20  Update contents 
e2b0: 6f 66 20 61 54 72 65 65 5b 5d 20 2a 2f 0a 20 20  of aTree[] */.  
e2c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e2d0: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  K ){.    int i; 
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
e300: 20 61 54 72 65 65 5b 5d 20 74 6f 20 72 65 63 61   aTree[] to reca
e310: 6c 63 75 6c 61 74 65 20 2a 2f 0a 20 20 20 20 50  lculate */.    P
e320: 6d 61 52 65 61 64 65 72 20 2a 70 52 65 61 64 72  maReader *pReadr
e330: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  1;         /* Fi
e340: 72 73 74 20 50 6d 61 52 65 61 64 65 72 20 74 6f  rst PmaReader to
e350: 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 20 20   compare */.    
e360: 50 6d 61 52 65 61 64 65 72 20 2a 70 52 65 61 64  PmaReader *pRead
e370: 72 32 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  r2;         /* S
e380: 65 63 6f 6e 64 20 50 6d 61 52 65 61 64 65 72 20  econd PmaReader 
e390: 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
e3a0: 20 20 69 6e 74 20 62 43 61 63 68 65 64 20 3d 20    int bCached = 
e3b0: 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20  0;..    /* Find 
e3c0: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 50 6d  the first two Pm
e3d0: 61 52 65 61 64 65 72 73 20 74 6f 20 63 6f 6d 70  aReaders to comp
e3e0: 61 72 65 2e 20 54 68 65 20 6f 6e 65 20 74 68 61  are. The one tha
e3f0: 74 20 77 61 73 20 6a 75 73 74 0a 20 20 20 20 2a  t was just.    *
e400: 2a 20 61 64 76 61 6e 63 65 64 20 28 69 50 72 65  * advanced (iPre
e410: 76 29 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 6e  v) and the one n
e420: 65 78 74 20 74 6f 20 69 74 20 69 6e 20 74 68 65  ext to it in the
e430: 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20   array.  */.    
e440: 70 52 65 61 64 72 31 20 3d 20 26 70 4d 65 72 67  pReadr1 = &pMerg
e450: 65 72 2d 3e 61 52 65 61 64 72 5b 28 69 50 72 65  er->aReadr[(iPre
e460: 76 20 26 20 30 78 46 46 46 45 29 5d 3b 0a 20 20  v & 0xFFFE)];.  
e470: 20 20 70 52 65 61 64 72 32 20 3d 20 26 70 4d 65    pReadr2 = &pMe
e480: 72 67 65 72 2d 3e 61 52 65 61 64 72 5b 28 69 50  rger->aReadr[(iP
e490: 72 65 76 20 7c 20 30 78 30 30 30 31 29 5d 3b 0a  rev | 0x0001)];.
e4a0: 0a 20 20 20 20 66 6f 72 28 69 3d 28 70 4d 65 72  .    for(i=(pMer
e4b0: 67 65 72 2d 3e 6e 54 72 65 65 2b 69 50 72 65 76  ger->nTree+iPrev
e4c0: 29 2f 32 3b 20 69 3e 30 3b 20 69 3d 69 2f 32 29  )/2; i>0; i=i/2)
e4d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61  {.      /* Compa
e4e0: 72 65 20 70 52 65 61 64 72 31 20 61 6e 64 20 70  re pReadr1 and p
e4f0: 52 65 61 64 72 32 2e 20 53 74 6f 72 65 20 74 68  Readr2. Store th
e500: 65 20 72 65 73 75 6c 74 20 69 6e 20 76 61 72 69  e result in vari
e510: 61 62 6c 65 20 69 52 65 73 2e 20 2a 2f 0a 20 20  able iRes. */.  
e520: 20 20 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20      int iRes;.  
e530: 20 20 20 20 69 66 28 20 70 52 65 61 64 72 31 2d      if( pReadr1-
e540: 3e 70 46 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >pFd==0 ){.     
e550: 20 20 20 69 52 65 73 20 3d 20 2b 31 3b 0a 20 20     iRes = +1;.  
e560: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52      }else if( pR
e570: 65 61 64 72 32 2d 3e 70 46 64 3d 3d 30 20 29 7b  eadr2->pFd==0 ){
e580: 0a 20 20 20 20 20 20 20 20 69 52 65 73 20 3d 20  .        iRes = 
e590: 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
e5a0: 0a 20 20 20 20 20 20 20 20 69 52 65 73 20 3d 20  .        iRes = 
e5b0: 70 54 61 73 6b 2d 3e 78 43 6f 6d 70 61 72 65 28  pTask->xCompare(
e5c0: 70 54 61 73 6b 2c 20 26 62 43 61 63 68 65 64 2c  pTask, &bCached,
e5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65  .            pRe
e5e0: 61 64 72 31 2d 3e 61 4b 65 79 2c 20 70 52 65 61  adr1->aKey, pRea
e5f0: 64 72 31 2d 3e 6e 4b 65 79 2c 20 70 52 65 61 64  dr1->nKey, pRead
e600: 72 32 2d 3e 61 4b 65 79 2c 20 70 52 65 61 64 72  r2->aKey, pReadr
e610: 32 2d 3e 6e 4b 65 79 0a 20 20 20 20 20 20 20 20  2->nKey.        
e620: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
e630: 20 20 2f 2a 20 49 66 20 70 52 65 61 64 72 31 20    /* If pReadr1 
e640: 63 6f 6e 74 61 69 6e 65 64 20 74 68 65 20 73 6d  contained the sm
e650: 61 6c 6c 65 72 20 76 61 6c 75 65 2c 20 73 65 74  aller value, set
e660: 20 61 54 72 65 65 5b 69 5d 20 74 6f 20 69 74 73   aTree[i] to its
e670: 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2a   index..      **
e680: 20 54 68 65 6e 20 73 65 74 20 70 52 65 61 64 72   Then set pReadr
e690: 32 20 74 6f 20 74 68 65 20 6e 65 78 74 20 50 6d  2 to the next Pm
e6a0: 61 52 65 61 64 65 72 20 74 6f 20 63 6f 6d 70 61  aReader to compa
e6b0: 72 65 20 74 6f 20 70 52 65 61 64 72 31 2e 20 49  re to pReadr1. I
e6c0: 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
e6d0: 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f  case there is no
e6e0: 20 63 61 63 68 65 20 6f 66 20 70 52 65 61 64 72   cache of pReadr
e6f0: 32 20 69 6e 20 70 54 61 73 6b 2d 3e 70 55 6e 70  2 in pTask->pUnp
e700: 61 63 6b 65 64 2c 20 73 6f 20 73 65 74 0a 20 20  acked, so set.  
e710: 20 20 20 20 2a 2a 20 70 4b 65 79 32 20 74 6f 20      ** pKey2 to 
e720: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 65 63  point to the rec
e730: 6f 72 64 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  ord belonging to
e740: 20 70 52 65 61 64 72 32 2e 0a 20 20 20 20 20 20   pReadr2..      
e750: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65  **.      ** Alte
e760: 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 70 52  rnatively, if pR
e770: 65 61 64 72 32 20 63 6f 6e 74 61 69 6e 73 20 74  eadr2 contains t
e780: 68 65 20 73 6d 61 6c 6c 65 72 20 6f 66 20 74 68  he smaller of th
e790: 65 20 74 77 6f 20 76 61 6c 75 65 73 2c 0a 20 20  e two values,.  
e7a0: 20 20 20 20 2a 2a 20 73 65 74 20 61 54 72 65 65      ** set aTree
e7b0: 5b 69 5d 20 74 6f 20 69 74 73 20 69 6e 64 65 78  [i] to its index
e7c0: 20 61 6e 64 20 75 70 64 61 74 65 20 70 52 65 61   and update pRea
e7d0: 64 72 31 2e 20 49 66 20 76 64 62 65 53 6f 72 74  dr1. If vdbeSort
e7e0: 65 72 43 6f 6d 70 61 72 65 28 29 0a 20 20 20 20  erCompare().    
e7f0: 20 20 2a 2a 20 77 61 73 20 61 63 74 75 61 6c 6c    ** was actuall
e800: 79 20 63 61 6c 6c 65 64 20 61 62 6f 76 65 2c 20  y called above, 
e810: 74 68 65 6e 20 70 54 61 73 6b 2d 3e 70 55 6e 70  then pTask->pUnp
e820: 61 63 6b 65 64 20 6e 6f 77 20 63 6f 6e 74 61 69  acked now contai
e830: 6e 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 61  ns.      ** a va
e840: 6c 75 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74  lue equivalent t
e850: 6f 20 70 52 65 61 64 72 32 2e 20 53 6f 20 73 65  o pReadr2. So se
e860: 74 20 70 4b 65 79 32 20 74 6f 20 4e 55 4c 4c 20  t pKey2 to NULL 
e870: 74 6f 20 70 72 65 76 65 6e 74 0a 20 20 20 20 20  to prevent.     
e880: 20 2a 2a 20 76 64 62 65 53 6f 72 74 65 72 43 6f   ** vdbeSorterCo
e890: 6d 70 61 72 65 28 29 20 66 72 6f 6d 20 64 65 63  mpare() from dec
e8a0: 6f 64 69 6e 67 20 70 52 65 61 64 72 32 20 61 67  oding pReadr2 ag
e8b0: 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ain..      **.  
e8c0: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 74 77      ** If the tw
e8d0: 6f 20 76 61 6c 75 65 73 20 77 65 72 65 20 65 71  o values were eq
e8e0: 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ual, then the va
e8f0: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64  lue from the old
e900: 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 50 4d 41  est.      ** PMA
e910: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69   should be consi
e920: 64 65 72 65 64 20 73 6d 61 6c 6c 65 72 2e 20 54  dered smaller. T
e930: 68 65 20 56 64 62 65 53 6f 72 74 65 72 2e 61 52  he VdbeSorter.aR
e940: 65 61 64 72 5b 5d 20 61 72 72 61 79 0a 20 20 20  eadr[] array.   
e950: 20 20 20 2a 2a 20 69 73 20 73 6f 72 74 65 64 20     ** is sorted 
e960: 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e  from oldest to n
e970: 65 77 65 73 74 2c 20 73 6f 20 70 52 65 61 64 72  ewest, so pReadr
e980: 31 20 63 6f 6e 74 61 69 6e 73 20 6f 6c 64 65 72  1 contains older
e990: 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a   values.      **
e9a0: 20 74 68 61 6e 20 70 52 65 61 64 72 32 20 69 66   than pReadr2 if
e9b0: 66 20 28 70 52 65 61 64 72 31 3c 70 52 65 61 64  f (pReadr1<pRead
e9c0: 72 32 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  r2).  */.      i
e9d0: 66 28 20 69 52 65 73 3c 30 20 7c 7c 20 28 69 52  f( iRes<0 || (iR
e9e0: 65 73 3d 3d 30 20 26 26 20 70 52 65 61 64 72 31  es==0 && pReadr1
e9f0: 3c 70 52 65 61 64 72 32 29 20 29 7b 0a 20 20 20  <pReadr2) ){.   
ea00: 20 20 20 20 20 70 4d 65 72 67 65 72 2d 3e 61 54       pMerger->aT
ea10: 72 65 65 5b 69 5d 20 3d 20 28 69 6e 74 29 28 70  ree[i] = (int)(p
ea20: 52 65 61 64 72 31 20 2d 20 70 4d 65 72 67 65 72  Readr1 - pMerger
ea30: 2d 3e 61 52 65 61 64 72 29 3b 0a 20 20 20 20 20  ->aReadr);.     
ea40: 20 20 20 70 52 65 61 64 72 32 20 3d 20 26 70 4d     pReadr2 = &pM
ea50: 65 72 67 65 72 2d 3e 61 52 65 61 64 72 5b 20 70  erger->aReadr[ p
ea60: 4d 65 72 67 65 72 2d 3e 61 54 72 65 65 5b 69 20  Merger->aTree[i 
ea70: 5e 20 30 78 30 30 30 31 5d 20 5d 3b 0a 20 20 20  ^ 0x0001] ];.   
ea80: 20 20 20 20 20 62 43 61 63 68 65 64 20 3d 20 30       bCached = 0
ea90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
eaa0: 20 20 20 20 20 20 20 69 66 28 20 70 52 65 61 64         if( pRead
eab0: 72 31 2d 3e 70 46 64 20 29 20 62 43 61 63 68 65  r1->pFd ) bCache
eac0: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  d = 0;.        p
ead0: 4d 65 72 67 65 72 2d 3e 61 54 72 65 65 5b 69 5d  Merger->aTree[i]
eae0: 20 3d 20 28 69 6e 74 29 28 70 52 65 61 64 72 32   = (int)(pReadr2
eaf0: 20 2d 20 70 4d 65 72 67 65 72 2d 3e 61 52 65 61   - pMerger->aRea
eb00: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  dr);.        pRe
eb10: 61 64 72 31 20 3d 20 26 70 4d 65 72 67 65 72 2d  adr1 = &pMerger-
eb20: 3e 61 52 65 61 64 72 5b 20 70 4d 65 72 67 65 72  >aReadr[ pMerger
eb30: 2d 3e 61 54 72 65 65 5b 69 20 5e 20 30 78 30 30  ->aTree[i ^ 0x00
eb40: 30 31 5d 20 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  01] ];.      }. 
eb50: 20 20 20 7d 0a 20 20 20 20 2a 70 62 45 6f 66 20     }.    *pbEof 
eb60: 3d 20 28 70 4d 65 72 67 65 72 2d 3e 61 52 65 61  = (pMerger->aRea
eb70: 64 72 5b 70 4d 65 72 67 65 72 2d 3e 61 54 72 65  dr[pMerger->aTre
eb80: 65 5b 31 5d 5d 2e 70 46 64 3d 3d 30 29 3b 0a 20  e[1]].pFd==0);. 
eb90: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63   }..  return (rc
eba0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 70 54  ==SQLITE_OK ? pT
ebb0: 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 2d 3e  ask->pUnpacked->
ebc0: 65 72 72 43 6f 64 65 20 3a 20 72 63 29 3b 0a 7d  errCode : rc);.}
ebd0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
ebe0: 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e  _WORKER_THREADS>
ebf0: 30 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  0./*.** The main
ec00: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 62 61 63   routine for bac
ec10: 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 73 20  kground threads 
ec20: 74 68 61 74 20 77 72 69 74 65 20 6c 65 76 65 6c  that write level
ec30: 2d 30 20 50 4d 41 73 2e 0a 2a 2f 0a 73 74 61 74  -0 PMAs..*/.stat
ec40: 69 63 20 76 6f 69 64 20 2a 76 64 62 65 53 6f 72  ic void *vdbeSor
ec50: 74 65 72 46 6c 75 73 68 54 68 72 65 61 64 28 76  terFlushThread(v
ec60: 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20 20 53 6f  oid *pCtx){.  So
ec70: 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b  rtSubtask *pTask
ec80: 20 3d 20 28 53 6f 72 74 53 75 62 74 61 73 6b 2a   = (SortSubtask*
ec90: 29 70 43 74 78 3b 0a 20 20 69 6e 74 20 72 63 3b  )pCtx;.  int rc;
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
ecc0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73  rn code */.  ass
ecd0: 65 72 74 28 20 70 54 61 73 6b 2d 3e 62 44 6f 6e  ert( pTask->bDon
ece0: 65 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 76  e==0 );.  rc = v
ecf0: 64 62 65 53 6f 72 74 65 72 4c 69 73 74 54 6f 50  dbeSorterListToP
ed00: 4d 41 28 70 54 61 73 6b 2c 20 26 70 54 61 73 6b  MA(pTask, &pTask
ed10: 2d 3e 6c 69 73 74 29 3b 0a 20 20 70 54 61 73 6b  ->list);.  pTask
ed20: 2d 3e 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 72  ->bDone = 1;.  r
ed30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54  eturn SQLITE_INT
ed40: 5f 54 4f 5f 50 54 52 28 72 63 29 3b 0a 7d 0a 23  _TO_PTR(rc);.}.#
ed50: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ed60: 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
ed70: 44 53 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46  DS>0 */../*.** F
ed80: 6c 75 73 68 20 74 68 65 20 63 75 72 72 65 6e 74  lush the current
ed90: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 56 64 62   contents of Vdb
eda0: 65 53 6f 72 74 65 72 2e 6c 69 73 74 20 74 6f 20  eSorter.list to 
edb0: 61 20 6e 65 77 20 50 4d 41 2c 20 70 6f 73 73 69  a new PMA, possi
edc0: 62 6c 79 0a 2a 2a 20 75 73 69 6e 67 20 61 20 62  bly.** using a b
edd0: 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64  ackground thread
ede0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
edf0: 76 64 62 65 53 6f 72 74 65 72 46 6c 75 73 68 50  vdbeSorterFlushP
ee00: 4d 41 28 56 64 62 65 53 6f 72 74 65 72 20 2a 70  MA(VdbeSorter *p
ee10: 53 6f 72 74 65 72 29 7b 0a 23 69 66 20 53 51 4c  Sorter){.#if SQL
ee20: 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
ee30: 48 52 45 41 44 53 3d 3d 30 0a 20 20 70 53 6f 72  HREADS==0.  pSor
ee40: 74 65 72 2d 3e 62 55 73 65 50 4d 41 20 3d 20 31  ter->bUsePMA = 1
ee50: 3b 0a 20 20 72 65 74 75 72 6e 20 76 64 62 65 53  ;.  return vdbeS
ee60: 6f 72 74 65 72 4c 69 73 74 54 6f 50 4d 41 28 26  orterListToPMA(&
ee70: 70 53 6f 72 74 65 72 2d 3e 61 54 61 73 6b 5b 30  pSorter->aTask[0
ee80: 5d 2c 20 26 70 53 6f 72 74 65 72 2d 3e 6c 69 73  ], &pSorter->lis
ee90: 74 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  t);.#else.  int 
eea0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
eeb0: 20 20 69 6e 74 20 69 3b 0a 20 20 53 6f 72 74 53    int i;.  SortS
eec0: 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 20 3d 20  ubtask *pTask = 
eed0: 30 3b 20 20 20 20 2f 2a 20 54 68 72 65 61 64 20  0;    /* Thread 
eee0: 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20  context used to 
eef0: 63 72 65 61 74 65 20 6e 65 77 20 50 4d 41 20 2a  create new PMA *
ef00: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 65 72 20  /.  int nWorker 
ef10: 3d 20 28 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73  = (pSorter->nTas
ef20: 6b 2d 31 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  k-1);..  /* Set 
ef30: 74 68 65 20 66 6c 61 67 20 74 6f 20 69 6e 64 69  the flag to indi
ef40: 63 61 74 65 20 74 68 61 74 20 61 74 20 6c 65 61  cate that at lea
ef50: 73 74 20 6f 6e 65 20 50 4d 41 20 68 61 73 20 62  st one PMA has b
ef60: 65 65 6e 20 77 72 69 74 74 65 6e 2e 20 0a 20 20  een written. .  
ef70: 2a 2a 20 4f 72 20 77 69 6c 6c 20 62 65 2c 20 61  ** Or will be, a
ef80: 6e 79 68 6f 77 2e 20 20 2a 2f 0a 20 20 70 53 6f  nyhow.  */.  pSo
ef90: 72 74 65 72 2d 3e 62 55 73 65 50 4d 41 20 3d 20  rter->bUsePMA = 
efa0: 31 3b 0a 0a 20 20 2f 2a 20 53 65 6c 65 63 74 20  1;..  /* Select 
efb0: 61 20 73 75 62 2d 74 61 73 6b 20 74 6f 20 73 6f  a sub-task to so
efc0: 72 74 20 61 6e 64 20 66 6c 75 73 68 20 74 68 65  rt and flush the
efd0: 20 63 75 72 72 65 6e 74 20 6c 69 73 74 20 6f 66   current list of
efe0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20   in-memory.  ** 
eff0: 72 65 63 6f 72 64 73 20 74 6f 20 64 69 73 6b 2e  records to disk.
f000: 20 49 66 20 74 68 65 20 73 6f 72 74 65 72 20 69   If the sorter i
f010: 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6d 75 6c  s running in mul
f020: 74 69 2d 74 68 72 65 61 64 65 64 20 6d 6f 64 65  ti-threaded mode
f030: 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 2d 72 6f 62  ,.  ** round-rob
f040: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 66  in between the f
f050: 69 72 73 74 20 28 70 53 6f 72 74 65 72 2d 3e 6e  irst (pSorter->n
f060: 54 61 73 6b 2d 31 29 20 74 61 73 6b 73 2e 20 45  Task-1) tasks. E
f070: 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74  xcept, if.  ** t
f080: 68 65 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68  he background th
f090: 72 65 61 64 20 66 72 6f 6d 20 61 20 73 75 62 2d  read from a sub-
f0a0: 74 61 73 6b 73 20 70 72 65 76 69 6f 75 73 20 74  tasks previous t
f0b0: 75 72 6e 20 69 73 20 73 74 69 6c 6c 20 72 75 6e  urn is still run
f0c0: 6e 69 6e 67 2c 0a 20 20 2a 2a 20 73 6b 69 70 20  ning,.  ** skip 
f0d0: 69 74 2e 20 49 66 20 74 68 65 20 66 69 72 73 74  it. If the first
f0e0: 20 28 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73 6b   (pSorter->nTask
f0f0: 2d 31 29 20 73 75 62 2d 74 61 73 6b 73 20 61 72  -1) sub-tasks ar
f100: 65 20 61 6c 6c 20 73 74 69 6c 6c 20 62 75 73 79  e all still busy
f110: 2c 0a 20 20 2a 2a 20 66 61 6c 6c 20 62 61 63 6b  ,.  ** fall back
f120: 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 66 69   to using the fi
f130: 6e 61 6c 20 73 75 62 2d 74 61 73 6b 2e 20 54 68  nal sub-task. Th
f140: 65 20 66 69 72 73 74 20 28 70 53 6f 72 74 65 72  e first (pSorter
f150: 2d 3e 6e 54 61 73 6b 2d 31 29 0a 20 20 2a 2a 20  ->nTask-1).  ** 
f160: 73 75 62 2d 74 61 73 6b 73 20 61 72 65 20 70 72  sub-tasks are pr
f170: 65 66 65 72 65 64 20 61 73 20 74 68 65 79 20 75  efered as they u
f180: 73 65 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68  se background th
f190: 72 65 61 64 73 20 2d 20 74 68 65 20 66 69 6e 61  reads - the fina
f1a0: 6c 20 0a 20 20 2a 2a 20 73 75 62 2d 74 61 73 6b  l .  ** sub-task
f1b0: 20 75 73 65 73 20 74 68 65 20 6d 61 69 6e 20 74   uses the main t
f1c0: 68 72 65 61 64 2e 20 2a 2f 0a 20 20 66 6f 72 28  hread. */.  for(
f1d0: 69 3d 30 3b 20 69 3c 6e 57 6f 72 6b 65 72 3b 20  i=0; i<nWorker; 
f1e0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 54  i++){.    int iT
f1f0: 65 73 74 20 3d 20 28 70 53 6f 72 74 65 72 2d 3e  est = (pSorter->
f200: 69 50 72 65 76 20 2b 20 69 20 2b 20 31 29 20 25  iPrev + i + 1) %
f210: 20 6e 57 6f 72 6b 65 72 3b 0a 20 20 20 20 70 54   nWorker;.    pT
f220: 61 73 6b 20 3d 20 26 70 53 6f 72 74 65 72 2d 3e  ask = &pSorter->
f230: 61 54 61 73 6b 5b 69 54 65 73 74 5d 3b 0a 20 20  aTask[iTest];.  
f240: 20 20 69 66 28 20 70 54 61 73 6b 2d 3e 62 44 6f    if( pTask->bDo
f250: 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ne ){.      rc =
f260: 20 76 64 62 65 53 6f 72 74 65 72 4a 6f 69 6e 54   vdbeSorterJoinT
f270: 68 72 65 61 64 28 70 54 61 73 6b 29 3b 0a 20 20  hread(pTask);.  
f280: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
f290: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 54 61  SQLITE_OK || pTa
f2a0: 73 6b 2d 3e 70 54 68 72 65 61 64 3d 3d 30 20 29  sk->pThread==0 )
f2b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
f2c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f2d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e   ){.    if( i==n
f2e0: 57 6f 72 6b 65 72 20 29 7b 0a 20 20 20 20 20 20  Worker ){.      
f2f0: 2f 2a 20 55 73 65 20 74 68 65 20 66 6f 72 65 67  /* Use the foreg
f300: 72 6f 75 6e 64 20 74 68 72 65 61 64 20 66 6f 72  round thread for
f310: 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
f320: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 76 64  */.      rc = vd
f330: 62 65 53 6f 72 74 65 72 4c 69 73 74 54 6f 50 4d  beSorterListToPM
f340: 41 28 26 70 53 6f 72 74 65 72 2d 3e 61 54 61 73  A(&pSorter->aTas
f350: 6b 5b 6e 57 6f 72 6b 65 72 5d 2c 20 26 70 53 6f  k[nWorker], &pSo
f360: 72 74 65 72 2d 3e 6c 69 73 74 29 3b 0a 20 20 20  rter->list);.   
f370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
f380: 20 4c 61 75 6e 63 68 20 61 20 62 61 63 6b 67 72   Launch a backgr
f390: 6f 75 6e 64 20 74 68 72 65 61 64 20 66 6f 72 20  ound thread for 
f3a0: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a  this operation *
f3b0: 2f 0a 20 20 20 20 20 20 75 38 20 2a 61 4d 65 6d  /.      u8 *aMem
f3c0: 20 3d 20 70 54 61 73 6b 2d 3e 6c 69 73 74 2e 61   = pTask->list.a
f3d0: 4d 65 6d 6f 72 79 3b 0a 20 20 20 20 20 20 76 6f  Memory;.      vo
f3e0: 69 64 20 2a 70 43 74 78 20 3d 20 28 76 6f 69 64  id *pCtx = (void
f3f0: 2a 29 70 54 61 73 6b 3b 0a 0a 20 20 20 20 20 20  *)pTask;..      
f400: 61 73 73 65 72 74 28 20 70 54 61 73 6b 2d 3e 70  assert( pTask->p
f410: 54 68 72 65 61 64 3d 3d 30 20 26 26 20 70 54 61  Thread==0 && pTa
f420: 73 6b 2d 3e 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a  sk->bDone==0 );.
f430: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
f440: 61 73 6b 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 3d  ask->list.pList=
f450: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
f460: 72 74 28 20 70 54 61 73 6b 2d 3e 6c 69 73 74 2e  rt( pTask->list.
f470: 61 4d 65 6d 6f 72 79 3d 3d 30 20 7c 7c 20 70 53  aMemory==0 || pS
f480: 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d  orter->list.aMem
f490: 6f 72 79 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20  ory!=0 );..     
f4a0: 20 70 53 6f 72 74 65 72 2d 3e 69 50 72 65 76 20   pSorter->iPrev 
f4b0: 3d 20 28 75 38 29 28 70 54 61 73 6b 20 2d 20 70  = (u8)(pTask - p
f4c0: 53 6f 72 74 65 72 2d 3e 61 54 61 73 6b 29 3b 0a  Sorter->aTask);.
f4d0: 20 20 20 20 20 20 70 54 61 73 6b 2d 3e 6c 69 73        pTask->lis
f4e0: 74 20 3d 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73  t = pSorter->lis
f4f0: 74 3b 0a 20 20 20 20 20 20 70 53 6f 72 74 65 72  t;.      pSorter
f500: 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 20 3d 20 30  ->list.pList = 0
f510: 3b 0a 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d  ;.      pSorter-
f520: 3e 6c 69 73 74 2e 73 7a 50 4d 41 20 3d 20 30 3b  >list.szPMA = 0;
f530: 0a 20 20 20 20 20 20 69 66 28 20 61 4d 65 6d 20  .      if( aMem 
f540: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 6f 72 74  ){.        pSort
f550: 65 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79  er->list.aMemory
f560: 20 3d 20 61 4d 65 6d 3b 0a 20 20 20 20 20 20 20   = aMem;.       
f570: 20 70 53 6f 72 74 65 72 2d 3e 6e 4d 65 6d 6f 72   pSorter->nMemor
f580: 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
f590: 63 53 69 7a 65 28 61 4d 65 6d 29 3b 0a 20 20 20  cSize(aMem);.   
f5a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 6f     }else if( pSo
f5b0: 72 74 65 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f  rter->list.aMemo
f5c0: 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  ry ){.        pS
f5d0: 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d  orter->list.aMem
f5e0: 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ory = sqlite3Mal
f5f0: 6c 6f 63 28 70 53 6f 72 74 65 72 2d 3e 6e 4d 65  loc(pSorter->nMe
f600: 6d 6f 72 79 29 3b 0a 20 20 20 20 20 20 20 20 69  mory);.        i
f610: 66 28 20 21 70 53 6f 72 74 65 72 2d 3e 6c 69 73  f( !pSorter->lis
f620: 74 2e 61 4d 65 6d 6f 72 79 20 29 20 72 65 74 75  t.aMemory ) retu
f630: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
f640: 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  BKPT;.      }.. 
f650: 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 53 6f       rc = vdbeSo
f660: 72 74 65 72 43 72 65 61 74 65 54 68 72 65 61 64  rterCreateThread
f670: 28 70 54 61 73 6b 2c 20 76 64 62 65 53 6f 72 74  (pTask, vdbeSort
f680: 65 72 46 6c 75 73 68 54 68 72 65 61 64 2c 20 70  erFlushThread, p
f690: 43 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Ctx);.    }.  }.
f6a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
f6b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
f6c0: 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
f6d0: 53 21 3d 30 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  S!=0 */.}../*.**
f6e0: 20 41 64 64 20 61 20 72 65 63 6f 72 64 20 74 6f   Add a record to
f6f0: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
f700: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
f710: 6f 72 74 65 72 57 72 69 74 65 28 0a 20 20 63 6f  orterWrite(.  co
f720: 6e 73 74 20 56 64 62 65 43 75 72 73 6f 72 20 2a  nst VdbeCursor *
f730: 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  pCsr,         /*
f740: 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 2a   Sorter cursor *
f750: 2f 0a 20 20 4d 65 6d 20 2a 70 56 61 6c 20 20 20  /.  Mem *pVal   
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f770: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
f780: 6c 6c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 65  ll containing re
f790: 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  cord */.){.  Vdb
f7a0: 65 53 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72  eSorter *pSorter
f7b0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
f7c0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
f7d0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
f7e0: 64 65 20 2a 2f 0a 20 20 53 6f 72 74 65 72 52 65  de */.  SorterRe
f7f0: 63 6f 72 64 20 2a 70 4e 65 77 3b 20 20 20 20 20  cord *pNew;     
f800: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6c          /* New l
f810: 69 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ist element */. 
f820: 20 69 6e 74 20 62 46 6c 75 73 68 3b 20 20 20 20   int bFlush;    
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 2f 2a 20 54 72 75 65 20 74 6f 20 66 6c 75 73   /* True to flus
f850: 68 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 65  h contents of me
f860: 6d 6f 72 79 20 74 6f 20 50 4d 41 20 2a 2f 0a 20  mory to PMA */. 
f870: 20 69 6e 74 20 6e 52 65 71 3b 20 20 20 20 20 20   int nReq;      
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d   /* Bytes of mem
f8a0: 6f 72 79 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ory required */.
f8b0: 20 20 69 6e 74 20 6e 50 4d 41 3b 20 20 20 20 20    int nPMA;     
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8d0: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 50 4d    /* Bytes of PM
f8e0: 41 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  A space required
f8f0: 20 2a 2f 0a 20 20 69 6e 74 20 74 3b 20 20 20 20   */.  int t;    
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f910: 20 20 20 20 20 20 2f 2a 20 73 65 72 69 61 6c 20        /* serial 
f920: 74 79 70 65 20 6f 66 20 66 69 72 73 74 20 72 65  type of first re
f930: 63 6f 72 64 20 66 69 65 6c 64 20 2a 2f 0a 0a 20  cord field */.. 
f940: 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 65   assert( pCsr->e
f950: 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
f960: 5f 53 4f 52 54 45 52 20 29 3b 0a 20 20 70 53 6f  _SORTER );.  pSo
f970: 72 74 65 72 20 3d 20 70 43 73 72 2d 3e 75 63 2e  rter = pCsr->uc.
f980: 70 53 6f 72 74 65 72 3b 0a 20 20 67 65 74 56 61  pSorter;.  getVa
f990: 72 69 6e 74 33 32 28 28 63 6f 6e 73 74 20 75 38  rint32((const u8
f9a0: 2a 29 26 70 56 61 6c 2d 3e 7a 5b 31 5d 2c 20 74  *)&pVal->z[1], t
f9b0: 29 3b 0a 20 20 69 66 28 20 74 3e 30 20 26 26 20  );.  if( t>0 && 
f9c0: 74 3c 31 30 20 26 26 20 74 21 3d 37 20 29 7b 0a  t<10 && t!=7 ){.
f9d0: 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 74 79 70      pSorter->typ
f9e0: 65 4d 61 73 6b 20 26 3d 20 53 4f 52 54 45 52 5f  eMask &= SORTER_
f9f0: 54 59 50 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  TYPE_INTEGER;.  
fa00: 7d 65 6c 73 65 20 69 66 28 20 74 3e 31 30 20 26  }else if( t>10 &
fa10: 26 20 28 74 20 26 20 30 78 30 31 29 20 29 7b 0a  & (t & 0x01) ){.
fa20: 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 74 79 70      pSorter->typ
fa30: 65 4d 61 73 6b 20 26 3d 20 53 4f 52 54 45 52 5f  eMask &= SORTER_
fa40: 54 59 50 45 5f 54 45 58 54 3b 0a 20 20 7d 65 6c  TYPE_TEXT;.  }el
fa50: 73 65 7b 0a 20 20 20 20 70 53 6f 72 74 65 72 2d  se{.    pSorter-
fa60: 3e 74 79 70 65 4d 61 73 6b 20 3d 20 30 3b 0a 20  >typeMask = 0;. 
fa70: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53   }..  assert( pS
fa80: 6f 72 74 65 72 20 29 3b 0a 0a 20 20 2f 2a 20 46  orter );..  /* F
fa90: 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65  igure out whethe
faa0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 75 72  r or not the cur
fab0: 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
fac0: 20 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62   memory should b
fad0: 65 0a 20 20 2a 2a 20 66 6c 75 73 68 65 64 20 74  e.  ** flushed t
fae0: 6f 20 61 20 50 4d 41 20 62 65 66 6f 72 65 20 63  o a PMA before c
faf0: 6f 6e 74 69 6e 75 69 6e 67 2e 20 49 66 20 73 6f  ontinuing. If so
fb00: 2c 20 64 6f 20 73 6f 2e 0a 20 20 2a 2a 0a 20 20  , do so..  **.  
fb10: 2a 2a 20 49 66 20 75 73 69 6e 67 20 74 68 65 20  ** If using the 
fb20: 73 69 6e 67 6c 65 20 6c 61 72 67 65 20 61 6c 6c  single large all
fb30: 6f 63 61 74 69 6f 6e 20 6d 6f 64 65 20 28 70 53  ocation mode (pS
fb40: 6f 72 74 65 72 2d 3e 61 4d 65 6d 6f 72 79 21 3d  orter->aMemory!=
fb50: 30 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 66 6c  0), then.  ** fl
fb60: 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ush the contents
fb70: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 61 20   of memory to a 
fb80: 6e 65 77 20 50 4d 41 20 69 66 20 28 61 29 20 61  new PMA if (a) a
fb90: 74 20 6c 65 61 73 74 20 6f 6e 65 20 76 61 6c 75  t least one valu
fba0: 65 20 69 73 0a 20 20 2a 2a 20 61 6c 72 65 61 64  e is.  ** alread
fbb0: 79 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20  y in memory and 
fbc0: 28 62 29 20 74 68 65 20 6e 65 77 20 76 61 6c 75  (b) the new valu
fbd0: 65 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 69  e will not fit i
fbe0: 6e 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 20 0a  n memory..  ** .
fbf0: 20 20 2a 2a 20 4f 72 2c 20 69 66 20 75 73 69 6e    ** Or, if usin
fc00: 67 20 73 65 70 61 72 61 74 65 20 61 6c 6c 6f 63  g separate alloc
fc10: 61 74 69 6f 6e 73 20 66 6f 72 20 65 61 63 68 20  ations for each 
fc20: 72 65 63 6f 72 64 2c 20 66 6c 75 73 68 20 74 68  record, flush th
fc30: 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20  e contents.  ** 
fc40: 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 61 20 50  of memory to a P
fc50: 4d 41 20 69 66 20 65 69 74 68 65 72 20 6f 66 20  MA if either of 
fc60: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
fc70: 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a  e true:.  **.  *
fc80: 2a 20 20 20 2a 20 54 68 65 20 74 6f 74 61 6c 20  *   * The total 
fc90: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64  memory allocated
fca0: 20 66 6f 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f   for the in-memo
fcb0: 72 79 20 6c 69 73 74 20 69 73 20 67 72 65 61 74  ry list is great
fcc0: 65 72 20 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  er .  **     tha
fcd0: 6e 20 28 70 61 67 65 2d 73 69 7a 65 20 2a 20 63  n (page-size * c
fce0: 61 63 68 65 2d 73 69 7a 65 29 2c 20 6f 72 0a 20  ache-size), or. 
fcf0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 54 68 65   **.  **   * The
fd00: 20 74 6f 74 61 6c 20 6d 65 6d 6f 72 79 20 61 6c   total memory al
fd10: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
fd20: 69 6e 2d 6d 65 6d 6f 72 79 20 6c 69 73 74 20 69  in-memory list i
fd30: 73 20 67 72 65 61 74 65 72 20 0a 20 20 2a 2a 20  s greater .  ** 
fd40: 20 20 20 20 74 68 61 6e 20 28 70 61 67 65 2d 73      than (page-s
fd50: 69 7a 65 20 2a 20 31 30 29 20 61 6e 64 20 73 71  ize * 10) and sq
fd60: 6c 69 74 65 33 48 65 61 70 4e 65 61 72 6c 79 46  lite3HeapNearlyF
fd70: 75 6c 6c 28 29 20 72 65 74 75 72 6e 73 20 74 72  ull() returns tr
fd80: 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 71 20  ue..  */.  nReq 
fd90: 3d 20 70 56 61 6c 2d 3e 6e 20 2b 20 73 69 7a 65  = pVal->n + size
fda0: 6f 66 28 53 6f 72 74 65 72 52 65 63 6f 72 64 29  of(SorterRecord)
fdb0: 3b 0a 20 20 6e 50 4d 41 20 3d 20 70 56 61 6c 2d  ;.  nPMA = pVal-
fdc0: 3e 6e 20 2b 20 73 71 6c 69 74 65 33 56 61 72 69  >n + sqlite3Vari
fdd0: 6e 74 4c 65 6e 28 70 56 61 6c 2d 3e 6e 29 3b 0a  ntLen(pVal->n);.
fde0: 20 20 69 66 28 20 70 53 6f 72 74 65 72 2d 3e 6d    if( pSorter->m
fdf0: 78 50 6d 61 53 69 7a 65 20 29 7b 0a 20 20 20 20  xPmaSize ){.    
fe00: 69 66 28 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73  if( pSorter->lis
fe10: 74 2e 61 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  t.aMemory ){.   
fe20: 20 20 20 62 46 6c 75 73 68 20 3d 20 70 53 6f 72     bFlush = pSor
fe30: 74 65 72 2d 3e 69 4d 65 6d 6f 72 79 20 26 26 20  ter->iMemory && 
fe40: 28 70 53 6f 72 74 65 72 2d 3e 69 4d 65 6d 6f 72  (pSorter->iMemor
fe50: 79 2b 6e 52 65 71 29 20 3e 20 70 53 6f 72 74 65  y+nReq) > pSorte
fe60: 72 2d 3e 6d 78 50 6d 61 53 69 7a 65 3b 0a 20 20  r->mxPmaSize;.  
fe70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
fe80: 46 6c 75 73 68 20 3d 20 28 0a 20 20 20 20 20 20  Flush = (.      
fe90: 20 20 20 20 28 70 53 6f 72 74 65 72 2d 3e 6c 69      (pSorter->li
fea0: 73 74 2e 73 7a 50 4d 41 20 3e 20 70 53 6f 72 74  st.szPMA > pSort
feb0: 65 72 2d 3e 6d 78 50 6d 61 53 69 7a 65 29 0a 20  er->mxPmaSize). 
fec0: 20 20 20 20 20 20 7c 7c 20 28 70 53 6f 72 74 65        || (pSorte
fed0: 72 2d 3e 6c 69 73 74 2e 73 7a 50 4d 41 20 3e 20  r->list.szPMA > 
fee0: 70 53 6f 72 74 65 72 2d 3e 6d 6e 50 6d 61 53 69  pSorter->mnPmaSi
fef0: 7a 65 20 26 26 20 73 71 6c 69 74 65 33 48 65 61  ze && sqlite3Hea
ff00: 70 4e 65 61 72 6c 79 46 75 6c 6c 28 29 29 0a 20  pNearlyFull()). 
ff10: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
ff20: 20 20 69 66 28 20 62 46 6c 75 73 68 20 29 7b 0a    if( bFlush ){.
ff30: 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 53        rc = vdbeS
ff40: 6f 72 74 65 72 46 6c 75 73 68 50 4d 41 28 70 53  orterFlushPMA(pS
ff50: 6f 72 74 65 72 29 3b 0a 20 20 20 20 20 20 70 53  orter);.      pS
ff60: 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 73 7a 50 4d  orter->list.szPM
ff70: 41 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 6f  A = 0;.      pSo
ff80: 72 74 65 72 2d 3e 69 4d 65 6d 6f 72 79 20 3d 20  rter->iMemory = 
ff90: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
ffa0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
ffb0: 7c 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e  | pSorter->list.
ffc0: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
ffd0: 7d 0a 20 20 7d 0a 0a 20 20 70 53 6f 72 74 65 72  }.  }..  pSorter
ffe0: 2d 3e 6c 69 73 74 2e 73 7a 50 4d 41 20 2b 3d 20  ->list.szPMA += 
fff0: 6e 50 4d 41 3b 0a 20 20 69 66 28 20 6e 50 4d 41  nPMA;.  if( nPMA
10000 3e 70 53 6f 72 74 65 72 2d 3e 6d 78 4b 65 79 73  >pSorter->mxKeys
10010 69 7a 65 20 29 7b 0a 20 20 20 20 70 53 6f 72 74  ize ){.    pSort
10020 65 72 2d 3e 6d 78 4b 65 79 73 69 7a 65 20 3d 20  er->mxKeysize = 
10030 6e 50 4d 41 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  nPMA;.  }..  if(
10040 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 61   pSorter->list.a
10050 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e  Memory ){.    in
10060 74 20 6e 4d 69 6e 20 3d 20 70 53 6f 72 74 65 72  t nMin = pSorter
10070 2d 3e 69 4d 65 6d 6f 72 79 20 2b 20 6e 52 65 71  ->iMemory + nReq
10080 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4d 69 6e 3e  ;..    if( nMin>
10090 70 53 6f 72 74 65 72 2d 3e 6e 4d 65 6d 6f 72 79  pSorter->nMemory
100a0 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 4e   ){.      u8 *aN
100b0 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c  ew;.      int iL
100c0 69 73 74 4f 66 66 20 3d 20 28 75 38 2a 29 70 53  istOff = (u8*)pS
100d0 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69 73  orter->list.pLis
100e0 74 20 2d 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73  t - pSorter->lis
100f0 74 2e 61 4d 65 6d 6f 72 79 3b 0a 20 20 20 20 20  t.aMemory;.     
10100 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 53 6f 72   int nNew = pSor
10110 74 65 72 2d 3e 6e 4d 65 6d 6f 72 79 20 2a 20 32  ter->nMemory * 2
10120 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e  ;.      while( n
10130 4e 65 77 20 3c 20 6e 4d 69 6e 20 29 20 6e 4e 65  New < nMin ) nNe
10140 77 20 3d 20 6e 4e 65 77 2a 32 3b 0a 20 20 20 20  w = nNew*2;.    
10150 20 20 69 66 28 20 6e 4e 65 77 20 3e 20 70 53 6f    if( nNew > pSo
10160 72 74 65 72 2d 3e 6d 78 50 6d 61 53 69 7a 65 20  rter->mxPmaSize 
10170 29 20 6e 4e 65 77 20 3d 20 70 53 6f 72 74 65 72  ) nNew = pSorter
10180 2d 3e 6d 78 50 6d 61 53 69 7a 65 3b 0a 20 20 20  ->mxPmaSize;.   
10190 20 20 20 69 66 28 20 6e 4e 65 77 20 3c 20 6e 4d     if( nNew < nM
101a0 69 6e 20 29 20 6e 4e 65 77 20 3d 20 6e 4d 69 6e  in ) nNew = nMin
101b0 3b 0a 0a 20 20 20 20 20 20 61 4e 65 77 20 3d 20  ;..      aNew = 
101c0 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 70  sqlite3Realloc(p
101d0 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 61 4d 65  Sorter->list.aMe
101e0 6d 6f 72 79 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  mory, nNew);.   
101f0 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 20 72     if( !aNew ) r
10200 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
10210 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 70  EM_BKPT;.      p
10220 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69  Sorter->list.pLi
10230 73 74 20 3d 20 28 53 6f 72 74 65 72 52 65 63 6f  st = (SorterReco
10240 72 64 2a 29 26 61 4e 65 77 5b 69 4c 69 73 74 4f  rd*)&aNew[iListO
10250 66 66 5d 3b 0a 20 20 20 20 20 20 70 53 6f 72 74  ff];.      pSort
10260 65 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79  er->list.aMemory
10270 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70   = aNew;.      p
10280 53 6f 72 74 65 72 2d 3e 6e 4d 65 6d 6f 72 79 20  Sorter->nMemory 
10290 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a 20  = nNew;.    }.. 
102a0 20 20 20 70 4e 65 77 20 3d 20 28 53 6f 72 74 65     pNew = (Sorte
102b0 72 52 65 63 6f 72 64 2a 29 26 70 53 6f 72 74 65  rRecord*)&pSorte
102c0 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 5b  r->list.aMemory[
102d0 70 53 6f 72 74 65 72 2d 3e 69 4d 65 6d 6f 72 79  pSorter->iMemory
102e0 5d 3b 0a 20 20 20 20 70 53 6f 72 74 65 72 2d 3e  ];.    pSorter->
102f0 69 4d 65 6d 6f 72 79 20 2b 3d 20 52 4f 55 4e 44  iMemory += ROUND
10300 38 28 6e 52 65 71 29 3b 0a 20 20 20 20 69 66 28  8(nReq);.    if(
10310 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 70   pSorter->list.p
10320 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 70 4e  List ){.      pN
10330 65 77 2d 3e 75 2e 69 4e 65 78 74 20 3d 20 28 69  ew->u.iNext = (i
10340 6e 74 29 28 28 75 38 2a 29 28 70 53 6f 72 74 65  nt)((u8*)(pSorte
10350 72 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 29 20 2d  r->list.pList) -
10360 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 61   pSorter->list.a
10370 4d 65 6d 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20  Memory);.    }. 
10380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
10390 20 3d 20 28 53 6f 72 74 65 72 52 65 63 6f 72 64   = (SorterRecord
103a0 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
103b0 28 6e 52 65 71 29 3b 0a 20 20 20 20 69 66 28 20  (nReq);.    if( 
103c0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
103d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
103e0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
103f0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 70 4e 65  .    pNew->u.pNe
10400 78 74 20 3d 20 70 53 6f 72 74 65 72 2d 3e 6c 69  xt = pSorter->li
10410 73 74 2e 70 4c 69 73 74 3b 0a 20 20 7d 0a 0a 20  st.pList;.  }.. 
10420 20 6d 65 6d 63 70 79 28 53 52 56 41 4c 28 70 4e   memcpy(SRVAL(pN
10430 65 77 29 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56  ew), pVal->z, pV
10440 61 6c 2d 3e 6e 29 3b 0a 20 20 70 4e 65 77 2d 3e  al->n);.  pNew->
10450 6e 56 61 6c 20 3d 20 70 56 61 6c 2d 3e 6e 3b 0a  nVal = pVal->n;.
10460 20 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e    pSorter->list.
10470 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 0a 20  pList = pNew;.. 
10480 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10490 2a 0a 2a 2a 20 52 65 61 64 20 6b 65 79 73 20 66  *.** Read keys f
104a0 72 6f 6d 20 70 49 6e 63 72 2d 3e 70 4d 65 72 67  rom pIncr->pMerg
104b0 65 72 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  er and populate 
104c0 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 31 5d 2e  pIncr->aFile[1].
104d0 20 54 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 6f   The format.** o
104e0 66 20 74 68 65 20 64 61 74 61 20 73 74 6f 72 65  f the data store
104f0 64 20 69 6e 20 61 46 69 6c 65 5b 31 5d 20 69 73  d in aFile[1] is
10500 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 61   the same as tha
10510 74 20 75 73 65 64 20 62 79 20 72 65 67 75 6c 61  t used by regula
10520 72 20 50 4d 41 73 2c 0a 2a 2a 20 65 78 63 65 70  r PMAs,.** excep
10530 74 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  t that the numbe
10540 72 2d 6f 66 2d 62 79 74 65 73 20 76 61 72 69 6e  r-of-bytes varin
10550 74 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  t is omitted fro
10560 6d 20 74 68 65 20 73 74 61 72 74 2e 0a 2a 2f 0a  m the start..*/.
10570 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 49  static int vdbeI
10580 6e 63 72 50 6f 70 75 6c 61 74 65 28 49 6e 63 72  ncrPopulate(Incr
10590 4d 65 72 67 65 72 20 2a 70 49 6e 63 72 29 7b 0a  Merger *pIncr){.
105a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
105b0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32 3b  E_OK;.  int rc2;
105c0 0a 20 20 69 36 34 20 69 53 74 61 72 74 20 3d 20  .  i64 iStart = 
105d0 70 49 6e 63 72 2d 3e 69 53 74 61 72 74 4f 66 66  pIncr->iStartOff
105e0 3b 0a 20 20 53 6f 72 74 65 72 46 69 6c 65 20 2a  ;.  SorterFile *
105f0 70 4f 75 74 20 3d 20 26 70 49 6e 63 72 2d 3e 61  pOut = &pIncr->a
10600 46 69 6c 65 5b 31 5d 3b 0a 20 20 53 6f 72 74 53  File[1];.  SortS
10610 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 20 3d 20  ubtask *pTask = 
10620 70 49 6e 63 72 2d 3e 70 54 61 73 6b 3b 0a 20 20  pIncr->pTask;.  
10630 4d 65 72 67 65 45 6e 67 69 6e 65 20 2a 70 4d 65  MergeEngine *pMe
10640 72 67 65 72 20 3d 20 70 49 6e 63 72 2d 3e 70 4d  rger = pIncr->pM
10650 65 72 67 65 72 3b 0a 20 20 50 6d 61 57 72 69 74  erger;.  PmaWrit
10660 65 72 20 77 72 69 74 65 72 3b 0a 20 20 61 73 73  er writer;.  ass
10670 65 72 74 28 20 70 49 6e 63 72 2d 3e 62 45 6f 66  ert( pIncr->bEof
10680 3d 3d 30 20 29 3b 0a 0a 20 20 76 64 62 65 53 6f  ==0 );..  vdbeSo
10690 72 74 65 72 50 6f 70 75 6c 61 74 65 44 65 62 75  rterPopulateDebu
106a0 67 28 70 54 61 73 6b 2c 20 22 65 6e 74 65 72 22  g(pTask, "enter"
106b0 29 3b 0a 0a 20 20 76 64 62 65 50 6d 61 57 72 69  );..  vdbePmaWri
106c0 74 65 72 49 6e 69 74 28 70 4f 75 74 2d 3e 70 46  terInit(pOut->pF
106d0 64 2c 20 26 77 72 69 74 65 72 2c 20 70 54 61 73  d, &writer, pTas
106e0 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 70 67 73 7a  k->pSorter->pgsz
106f0 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 77 68 69  , iStart);.  whi
10700 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
10710 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d  K ){.    int dum
10720 6d 79 3b 0a 20 20 20 20 50 6d 61 52 65 61 64 65  my;.    PmaReade
10730 72 20 2a 70 52 65 61 64 65 72 20 3d 20 26 70 4d  r *pReader = &pM
10740 65 72 67 65 72 2d 3e 61 52 65 61 64 72 5b 20 70  erger->aReadr[ p
10750 4d 65 72 67 65 72 2d 3e 61 54 72 65 65 5b 31 5d  Merger->aTree[1]
10760 20 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79   ];.    int nKey
10770 20 3d 20 70 52 65 61 64 65 72 2d 3e 6e 4b 65 79   = pReader->nKey
10780 3b 0a 20 20 20 20 69 36 34 20 69 45 6f 66 20 3d  ;.    i64 iEof =
10790 20 77 72 69 74 65 72 2e 69 57 72 69 74 65 4f 66   writer.iWriteOf
107a0 66 20 2b 20 77 72 69 74 65 72 2e 69 42 75 66 45  f + writer.iBufE
107b0 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  nd;..    /* Chec
107c0 6b 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  k if the output 
107d0 66 69 6c 65 20 69 73 20 66 75 6c 6c 20 6f 72 20  file is full or 
107e0 69 66 20 74 68 65 20 69 6e 70 75 74 20 68 61 73  if the input has
107f0 20 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e   been exhausted.
10800 0a 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65  .    ** In eithe
10810 72 20 63 61 73 65 20 65 78 69 74 20 74 68 65 20  r case exit the 
10820 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 69 66 28  loop. */.    if(
10830 20 70 52 65 61 64 65 72 2d 3e 70 46 64 3d 3d 30   pReader->pFd==0
10840 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
10850 28 20 28 69 45 6f 66 20 2b 20 6e 4b 65 79 20 2b  ( (iEof + nKey +
10860 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65   sqlite3VarintLe
10870 6e 28 6e 4b 65 79 29 29 3e 28 69 53 74 61 72 74  n(nKey))>(iStart
10880 20 2b 20 70 49 6e 63 72 2d 3e 6d 78 53 7a 29 20   + pIncr->mxSz) 
10890 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
108a0 20 57 72 69 74 65 20 74 68 65 20 6e 65 78 74 20   Write the next 
108b0 6b 65 79 20 74 6f 20 74 68 65 20 6f 75 74 70 75  key to the outpu
108c0 74 2e 20 2a 2f 0a 20 20 20 20 76 64 62 65 50 6d  t. */.    vdbePm
108d0 61 57 72 69 74 65 56 61 72 69 6e 74 28 26 77 72  aWriteVarint(&wr
108e0 69 74 65 72 2c 20 6e 4b 65 79 29 3b 0a 20 20 20  iter, nKey);.   
108f0 20 76 64 62 65 50 6d 61 57 72 69 74 65 42 6c 6f   vdbePmaWriteBlo
10900 62 28 26 77 72 69 74 65 72 2c 20 70 52 65 61 64  b(&writer, pRead
10910 65 72 2d 3e 61 4b 65 79 2c 20 6e 4b 65 79 29 3b  er->aKey, nKey);
10920 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
10930 63 72 2d 3e 70 4d 65 72 67 65 72 2d 3e 70 54 61  cr->pMerger->pTa
10940 73 6b 3d 3d 70 54 61 73 6b 20 29 3b 0a 20 20 20  sk==pTask );.   
10950 20 72 63 20 3d 20 76 64 62 65 4d 65 72 67 65 45   rc = vdbeMergeE
10960 6e 67 69 6e 65 53 74 65 70 28 70 49 6e 63 72 2d  ngineStep(pIncr-
10970 3e 70 4d 65 72 67 65 72 2c 20 26 64 75 6d 6d 79  >pMerger, &dummy
10980 29 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20  );.  }..  rc2 = 
10990 76 64 62 65 50 6d 61 57 72 69 74 65 72 46 69 6e  vdbePmaWriterFin
109a0 69 73 68 28 26 77 72 69 74 65 72 2c 20 26 70 4f  ish(&writer, &pO
109b0 75 74 2d 3e 69 45 6f 66 29 3b 0a 20 20 69 66 28  ut->iEof);.  if(
109c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
109d0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 76 64 62   rc = rc2;.  vdb
109e0 65 53 6f 72 74 65 72 50 6f 70 75 6c 61 74 65 44  eSorterPopulateD
109f0 65 62 75 67 28 70 54 61 73 6b 2c 20 22 65 78 69  ebug(pTask, "exi
10a00 74 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  t");.  return rc
10a10 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
10a20 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
10a30 44 53 3e 30 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  DS>0./*.** The m
10a40 61 69 6e 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ain routine for 
10a50 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61  background threa
10a60 64 73 20 74 68 61 74 20 70 6f 70 75 6c 61 74 65  ds that populate
10a70 20 61 46 69 6c 65 5b 31 5d 20 6f 66 0a 2a 2a 20   aFile[1] of.** 
10a80 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 49  multi-threaded I
10a90 6e 63 72 4d 65 72 67 65 72 20 6f 62 6a 65 63 74  ncrMerger object
10aa0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
10ab0 64 20 2a 76 64 62 65 49 6e 63 72 50 6f 70 75 6c  d *vdbeIncrPopul
10ac0 61 74 65 54 68 72 65 61 64 28 76 6f 69 64 20 2a  ateThread(void *
10ad0 70 43 74 78 29 7b 0a 20 20 49 6e 63 72 4d 65 72  pCtx){.  IncrMer
10ae0 67 65 72 20 2a 70 49 6e 63 72 20 3d 20 28 49 6e  ger *pIncr = (In
10af0 63 72 4d 65 72 67 65 72 2a 29 70 43 74 78 3b 0a  crMerger*)pCtx;.
10b00 20 20 76 6f 69 64 20 2a 70 52 65 74 20 3d 20 53    void *pRet = S
10b10 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
10b20 28 20 76 64 62 65 49 6e 63 72 50 6f 70 75 6c 61  ( vdbeIncrPopula
10b30 74 65 28 70 49 6e 63 72 29 20 29 3b 0a 20 20 70  te(pIncr) );.  p
10b40 49 6e 63 72 2d 3e 70 54 61 73 6b 2d 3e 62 44 6f  Incr->pTask->bDo
10b50 6e 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  ne = 1;.  return
10b60 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
10b70 4c 61 75 6e 63 68 20 61 20 62 61 63 6b 67 72 6f  Launch a backgro
10b80 75 6e 64 20 74 68 72 65 61 64 20 74 6f 20 70 6f  und thread to po
10b90 70 75 6c 61 74 65 20 61 46 69 6c 65 5b 31 5d 20  pulate aFile[1] 
10ba0 6f 66 20 70 49 6e 63 72 2e 0a 2a 2f 0a 73 74 61  of pIncr..*/.sta
10bb0 74 69 63 20 69 6e 74 20 76 64 62 65 49 6e 63 72  tic int vdbeIncr
10bc0 42 67 50 6f 70 75 6c 61 74 65 28 49 6e 63 72 4d  BgPopulate(IncrM
10bd0 65 72 67 65 72 20 2a 70 49 6e 63 72 29 7b 0a 20  erger *pIncr){. 
10be0 20 76 6f 69 64 20 2a 70 20 3d 20 28 76 6f 69 64   void *p = (void
10bf0 2a 29 70 49 6e 63 72 3b 0a 20 20 61 73 73 65 72  *)pIncr;.  asser
10c00 74 28 20 70 49 6e 63 72 2d 3e 62 55 73 65 54 68  t( pIncr->bUseTh
10c10 72 65 61 64 20 29 3b 0a 20 20 72 65 74 75 72 6e  read );.  return
10c20 20 76 64 62 65 53 6f 72 74 65 72 43 72 65 61 74   vdbeSorterCreat
10c30 65 54 68 72 65 61 64 28 70 49 6e 63 72 2d 3e 70  eThread(pIncr->p
10c40 54 61 73 6b 2c 20 76 64 62 65 49 6e 63 72 50 6f  Task, vdbeIncrPo
10c50 70 75 6c 61 74 65 54 68 72 65 61 64 2c 20 70 29  pulateThread, p)
10c60 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
10c70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
10c80 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
10c90 68 65 20 50 6d 61 52 65 61 64 65 72 20 63 6f 72  he PmaReader cor
10ca0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 49  responding to pI
10cb0 6e 63 72 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73  ncr has.** finis
10cc0 68 65 64 20 72 65 61 64 69 6e 67 20 74 68 65 20  hed reading the 
10cd0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 46 69 6c  contents of aFil
10ce0 65 5b 30 5d 2e 20 49 74 73 20 70 75 72 70 6f 73  e[0]. Its purpos
10cf0 65 20 69 73 20 74 6f 20 22 72 65 66 69 6c 6c 22  e is to "refill"
10d00 0a 2a 2a 20 61 46 69 6c 65 5b 30 5d 20 73 75 63  .** aFile[0] suc
10d10 68 20 74 68 61 74 20 74 68 65 20 50 6d 61 52 65  h that the PmaRe
10d20 61 64 65 72 20 73 68 6f 75 6c 64 20 73 74 61 72  ader should star
10d30 74 20 72 65 72 65 61 64 69 6e 67 20 69 74 20 66  t rereading it f
10d40 72 6f 6d 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e  rom the.** begin
10d50 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ning..**.** For 
10d60 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20  single-threaded 
10d70 6f 62 6a 65 63 74 73 2c 20 74 68 69 73 20 69 73  objects, this is
10d80 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 20 62 79   accomplished by
10d90 20 6c 69 74 65 72 61 6c 6c 79 20 72 65 61 64 69   literally readi
10da0 6e 67 20 0a 2a 2a 20 6b 65 79 73 20 66 72 6f 6d  ng .** keys from
10db0 20 70 49 6e 63 72 2d 3e 70 4d 65 72 67 65 72 20   pIncr->pMerger 
10dc0 61 6e 64 20 72 65 70 6f 70 75 6c 61 74 69 6e 67  and repopulating
10dd0 20 61 46 69 6c 65 5b 30 5d 2e 20 0a 2a 2a 0a 2a   aFile[0]. .**.*
10de0 2a 20 46 6f 72 20 6d 75 6c 74 69 2d 74 68 72 65  * For multi-thre
10df0 61 64 65 64 20 6f 62 6a 65 63 74 73 2c 20 61 6c  aded objects, al
10e00 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
10e10 65 64 20 69 73 20 74 6f 20 77 61 69 74 20 75 6e  ed is to wait un
10e20 74 69 6c 20 74 68 65 20 0a 2a 2a 20 62 61 63 6b  til the .** back
10e30 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 69 73  ground thread is
10e40 20 66 69 6e 69 73 68 65 64 20 28 69 66 20 69 74   finished (if it
10e50 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29   is not already)
10e60 20 61 6e 64 20 74 68 65 6e 20 73 77 61 70 20 0a   and then swap .
10e70 2a 2a 20 61 46 69 6c 65 5b 30 5d 20 61 6e 64 20  ** aFile[0] and 
10e80 61 46 69 6c 65 5b 31 5d 20 69 6e 20 70 6c 61 63  aFile[1] in plac
10e90 65 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  e. If the conten
10ea0 74 73 20 6f 66 20 70 4d 65 72 67 65 72 20 68 61  ts of pMerger ha
10eb0 76 65 20 6e 6f 74 0a 2a 2a 20 62 65 65 6e 20 65  ve not.** been e
10ec0 78 68 61 75 73 74 65 64 2c 20 74 68 69 73 20 66  xhausted, this f
10ed0 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 6c 61 75  unction also lau
10ee0 6e 63 68 65 73 20 61 20 6e 65 77 20 62 61 63 6b  nches a new back
10ef0 67 72 6f 75 6e 64 20 74 68 72 65 61 64 0a 2a 2a  ground thread.**
10f00 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
10f10 20 6e 65 77 20 61 46 69 6c 65 5b 31 5d 2e 0a 2a   new aFile[1]..*
10f20 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
10f30 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
10f40 63 63 65 73 73 2c 20 6f 72 20 61 6e 20 53 51 4c  ccess, or an SQL
10f50 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
10f60 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
10f70 74 69 63 20 69 6e 74 20 76 64 62 65 49 6e 63 72  tic int vdbeIncr
10f80 53 77 61 70 28 49 6e 63 72 4d 65 72 67 65 72 20  Swap(IncrMerger 
10f90 2a 70 49 6e 63 72 29 7b 0a 20 20 69 6e 74 20 72  *pIncr){.  int r
10fa0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
10fb0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  #if SQLITE_MAX_W
10fc0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 0a  ORKER_THREADS>0.
10fd0 20 20 69 66 28 20 70 49 6e 63 72 2d 3e 62 55 73    if( pIncr->bUs
10fe0 65 54 68 72 65 61 64 20 29 7b 0a 20 20 20 20 72  eThread ){.    r
10ff0 63 20 3d 20 76 64 62 65 53 6f 72 74 65 72 4a 6f  c = vdbeSorterJo
11000 69 6e 54 68 72 65 61 64 28 70 49 6e 63 72 2d 3e  inThread(pIncr->
11010 70 54 61 73 6b 29 3b 0a 0a 20 20 20 20 69 66 28  pTask);..    if(
11020 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11030 7b 0a 20 20 20 20 20 20 53 6f 72 74 65 72 46 69  {.      SorterFi
11040 6c 65 20 66 30 20 3d 20 70 49 6e 63 72 2d 3e 61  le f0 = pIncr->a
11050 46 69 6c 65 5b 30 5d 3b 0a 20 20 20 20 20 20 70  File[0];.      p
11060 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 30 5d 20 3d  Incr->aFile[0] =
11070 20 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 31 5d   pIncr->aFile[1]
11080 3b 0a 20 20 20 20 20 20 70 49 6e 63 72 2d 3e 61  ;.      pIncr->a
11090 46 69 6c 65 5b 31 5d 20 3d 20 66 30 3b 0a 20 20  File[1] = f0;.  
110a0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
110b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
110c0 20 20 20 20 69 66 28 20 70 49 6e 63 72 2d 3e 61      if( pIncr->a
110d0 46 69 6c 65 5b 30 5d 2e 69 45 6f 66 3d 3d 70 49  File[0].iEof==pI
110e0 6e 63 72 2d 3e 69 53 74 61 72 74 4f 66 66 20 29  ncr->iStartOff )
110f0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 63 72 2d  {.        pIncr-
11100 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 20  >bEof = 1;.     
11110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11120 72 63 20 3d 20 76 64 62 65 49 6e 63 72 42 67 50  rc = vdbeIncrBgP
11130 6f 70 75 6c 61 74 65 28 70 49 6e 63 72 29 3b 0a  opulate(pIncr);.
11140 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11150 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
11160 0a 20 20 20 20 72 63 20 3d 20 76 64 62 65 49 6e  .    rc = vdbeIn
11170 63 72 50 6f 70 75 6c 61 74 65 28 70 49 6e 63 72  crPopulate(pIncr
11180 29 3b 0a 20 20 20 20 70 49 6e 63 72 2d 3e 61 46  );.    pIncr->aF
11190 69 6c 65 5b 30 5d 20 3d 20 70 49 6e 63 72 2d 3e  ile[0] = pIncr->
111a0 61 46 69 6c 65 5b 31 5d 3b 0a 20 20 20 20 69 66  aFile[1];.    if
111b0 28 20 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 30  ( pIncr->aFile[0
111c0 5d 2e 69 45 6f 66 3d 3d 70 49 6e 63 72 2d 3e 69  ].iEof==pIncr->i
111d0 53 74 61 72 74 4f 66 66 20 29 7b 0a 20 20 20 20  StartOff ){.    
111e0 20 20 70 49 6e 63 72 2d 3e 62 45 6f 66 20 3d 20    pIncr->bEof = 
111f0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
11200 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11210 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
11220 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20 49 6e   return a new In
11230 63 72 4d 65 72 67 65 72 20 6f 62 6a 65 63 74 20  crMerger object 
11240 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
11250 6d 20 70 4d 65 72 67 65 72 2e 0a 2a 2a 0a 2a 2a  m pMerger..**.**
11260 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69   If an OOM condi
11270 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65  tion is encounte
11280 72 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  red, return NULL
11290 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 66  . In this case f
112a0 72 65 65 20 74 68 65 0a 2a 2a 20 70 4d 65 72 67  ree the.** pMerg
112b0 65 72 20 61 72 67 75 6d 65 6e 74 20 62 65 66 6f  er argument befo
112c0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
112d0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
112e0 49 6e 63 72 4d 65 72 67 65 72 4e 65 77 28 0a 20  IncrMergerNew(. 
112f0 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54   SortSubtask *pT
11300 61 73 6b 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ask,     /* The 
11310 74 68 72 65 61 64 20 74 68 61 74 20 77 69 6c 6c  thread that will
11320 20 62 65 20 75 73 69 6e 67 20 74 68 65 20 6e 65   be using the ne
11330 77 20 49 6e 63 72 4d 65 72 67 65 72 20 2a 2f 0a  w IncrMerger */.
11340 20 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 2a 70    MergeEngine *p
11350 4d 65 72 67 65 72 2c 20 20 20 2f 2a 20 54 68 65  Merger,   /* The
11360 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 74 68 61   MergeEngine tha
11370 74 20 74 68 65 20 49 6e 63 72 4d 65 72 67 65 72  t the IncrMerger
11380 20 77 69 6c 6c 20 63 6f 6e 74 72 6f 6c 20 2a 2f   will control */
11390 0a 20 20 49 6e 63 72 4d 65 72 67 65 72 20 2a 2a  .  IncrMerger **
113a0 70 70 4f 75 74 20 20 20 20 20 20 2f 2a 20 57 72  ppOut      /* Wr
113b0 69 74 65 20 74 68 65 20 6e 65 77 20 49 6e 63 72  ite the new Incr
113c0 4d 65 72 67 65 72 20 68 65 72 65 20 2a 2f 0a 29  Merger here */.)
113d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
113e0 49 54 45 5f 4f 4b 3b 0a 20 20 49 6e 63 72 4d 65  ITE_OK;.  IncrMe
113f0 72 67 65 72 20 2a 70 49 6e 63 72 20 3d 20 2a 70  rger *pIncr = *p
11400 70 4f 75 74 20 3d 20 28 49 6e 63 72 4d 65 72 67  pOut = (IncrMerg
11410 65 72 2a 29 0a 20 20 20 20 20 20 20 28 73 71 6c  er*).       (sql
11420 69 74 65 33 46 61 75 6c 74 53 69 6d 28 31 30 30  ite3FaultSim(100
11430 29 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4d  ) ? 0 : sqlite3M
11440 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
11450 28 2a 70 49 6e 63 72 29 29 29 3b 0a 20 20 69 66  (*pIncr)));.  if
11460 28 20 70 49 6e 63 72 20 29 7b 0a 20 20 20 20 70  ( pIncr ){.    p
11470 49 6e 63 72 2d 3e 70 4d 65 72 67 65 72 20 3d 20  Incr->pMerger = 
11480 70 4d 65 72 67 65 72 3b 0a 20 20 20 20 70 49 6e  pMerger;.    pIn
11490 63 72 2d 3e 70 54 61 73 6b 20 3d 20 70 54 61 73  cr->pTask = pTas
114a0 6b 3b 0a 20 20 20 20 70 49 6e 63 72 2d 3e 6d 78  k;.    pIncr->mx
114b0 53 7a 20 3d 20 4d 41 58 28 70 54 61 73 6b 2d 3e  Sz = MAX(pTask->
114c0 70 53 6f 72 74 65 72 2d 3e 6d 78 4b 65 79 73 69  pSorter->mxKeysi
114d0 7a 65 2b 39 2c 70 54 61 73 6b 2d 3e 70 53 6f 72  ze+9,pTask->pSor
114e0 74 65 72 2d 3e 6d 78 50 6d 61 53 69 7a 65 2f 32  ter->mxPmaSize/2
114f0 29 3b 0a 20 20 20 20 70 54 61 73 6b 2d 3e 66 69  );.    pTask->fi
11500 6c 65 32 2e 69 45 6f 66 20 2b 3d 20 70 49 6e 63  le2.iEof += pInc
11510 72 2d 3e 6d 78 53 7a 3b 0a 20 20 7d 65 6c 73 65  r->mxSz;.  }else
11520 7b 0a 20 20 20 20 76 64 62 65 4d 65 72 67 65 45  {.    vdbeMergeE
11530 6e 67 69 6e 65 46 72 65 65 28 70 4d 65 72 67 65  ngineFree(pMerge
11540 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  r);.    rc = SQL
11550 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
11560 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11570 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
11580 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
11590 53 3e 30 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  S>0./*.** Set th
115a0 65 20 22 75 73 65 2d 74 68 72 65 61 64 73 22 20  e "use-threads" 
115b0 66 6c 61 67 20 6f 6e 20 6f 62 6a 65 63 74 20 70  flag on object p
115c0 49 6e 63 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Incr..*/.static 
115d0 76 6f 69 64 20 76 64 62 65 49 6e 63 72 4d 65 72  void vdbeIncrMer
115e0 67 65 72 53 65 74 54 68 72 65 61 64 73 28 49 6e  gerSetThreads(In
115f0 63 72 4d 65 72 67 65 72 20 2a 70 49 6e 63 72 29  crMerger *pIncr)
11600 7b 0a 20 20 70 49 6e 63 72 2d 3e 62 55 73 65 54  {.  pIncr->bUseT
11610 68 72 65 61 64 20 3d 20 31 3b 0a 20 20 70 49 6e  hread = 1;.  pIn
11620 63 72 2d 3e 70 54 61 73 6b 2d 3e 66 69 6c 65 32  cr->pTask->file2
11630 2e 69 45 6f 66 20 2d 3d 20 70 49 6e 63 72 2d 3e  .iEof -= pIncr->
11640 6d 78 53 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  mxSz;.}.#endif /
11650 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  * SQLITE_MAX_WOR
11660 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 20 2a 2f  KER_THREADS>0 */
11670 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  ..../*.** Recomp
11680 75 74 65 20 70 4d 65 72 67 65 72 2d 3e 61 54 72  ute pMerger->aTr
11690 65 65 5b 69 4f 75 74 5d 20 62 79 20 63 6f 6d 70  ee[iOut] by comp
116a0 61 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 6b  aring the next k
116b0 65 79 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 74 77  eys on the.** tw
116c0 6f 20 50 6d 61 52 65 61 64 65 72 73 20 74 68 61  o PmaReaders tha
116d0 74 20 66 65 65 64 20 74 68 61 74 20 65 6e 74 72  t feed that entr
116e0 79 2e 20 20 4e 65 69 74 68 65 72 20 6f 66 20 74  y.  Neither of t
116f0 68 65 20 50 6d 61 52 65 61 64 65 72 73 0a 2a 2a  he PmaReaders.**
11700 20 61 72 65 20 61 64 76 61 6e 63 65 64 2e 20 20   are advanced.  
11710 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72  This routine mer
11720 65 6c 79 20 64 6f 65 73 20 74 68 65 20 63 6f 6d  ely does the com
11730 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
11740 69 63 20 76 6f 69 64 20 76 64 62 65 4d 65 72 67  ic void vdbeMerg
11750 65 45 6e 67 69 6e 65 43 6f 6d 70 61 72 65 28 0a  eEngineCompare(.
11760 20 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 2a 70    MergeEngine *p
11770 4d 65 72 67 65 72 2c 20 20 2f 2a 20 4d 65 72 67  Merger,  /* Merg
11780 65 20 65 6e 67 69 6e 65 20 63 6f 6e 74 61 69 6e  e engine contain
11790 69 6e 67 20 50 6d 61 52 65 61 64 65 72 73 20 74  ing PmaReaders t
117a0 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69  o compare */.  i
117b0 6e 74 20 69 4f 75 74 20 20 20 20 20 20 20 20 20  nt iOut         
117c0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
117d0 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65  he result in pMe
117e0 72 67 65 72 2d 3e 61 54 72 65 65 5b 69 4f 75 74  rger->aTree[iOut
117f0 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 31  ] */.){.  int i1
11800 3b 0a 20 20 69 6e 74 20 69 32 3b 0a 20 20 69 6e  ;.  int i2;.  in
11810 74 20 69 52 65 73 3b 0a 20 20 50 6d 61 52 65 61  t iRes;.  PmaRea
11820 64 65 72 20 2a 70 31 3b 0a 20 20 50 6d 61 52 65  der *p1;.  PmaRe
11830 61 64 65 72 20 2a 70 32 3b 0a 0a 20 20 61 73 73  ader *p2;..  ass
11840 65 72 74 28 20 69 4f 75 74 3c 70 4d 65 72 67 65  ert( iOut<pMerge
11850 72 2d 3e 6e 54 72 65 65 20 26 26 20 69 4f 75 74  r->nTree && iOut
11860 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 4f 75  >0 );..  if( iOu
11870 74 3e 3d 28 70 4d 65 72 67 65 72 2d 3e 6e 54 72  t>=(pMerger->nTr
11880 65 65 2f 32 29 20 29 7b 0a 20 20 20 20 69 31 20  ee/2) ){.    i1 
11890 3d 20 28 69 4f 75 74 20 2d 20 70 4d 65 72 67 65  = (iOut - pMerge
118a0 72 2d 3e 6e 54 72 65 65 2f 32 29 20 2a 20 32 3b  r->nTree/2) * 2;
118b0 0a 20 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31  .    i2 = i1 + 1
118c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
118d0 31 20 3d 20 70 4d 65 72 67 65 72 2d 3e 61 54 72  1 = pMerger->aTr
118e0 65 65 5b 69 4f 75 74 2a 32 5d 3b 0a 20 20 20 20  ee[iOut*2];.    
118f0 69 32 20 3d 20 70 4d 65 72 67 65 72 2d 3e 61 54  i2 = pMerger->aT
11900 72 65 65 5b 69 4f 75 74 2a 32 2b 31 5d 3b 0a 20  ree[iOut*2+1];. 
11910 20 7d 0a 0a 20 20 70 31 20 3d 20 26 70 4d 65 72   }..  p1 = &pMer
11920 67 65 72 2d 3e 61 52 65 61 64 72 5b 69 31 5d 3b  ger->aReadr[i1];
11930 0a 20 20 70 32 20 3d 20 26 70 4d 65 72 67 65 72  .  p2 = &pMerger
11940 2d 3e 61 52 65 61 64 72 5b 69 32 5d 3b 0a 0a 20  ->aReadr[i2];.. 
11950 20 69 66 28 20 70 31 2d 3e 70 46 64 3d 3d 30 20   if( p1->pFd==0 
11960 29 7b 0a 20 20 20 20 69 52 65 73 20 3d 20 69 32  ){.    iRes = i2
11970 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32  ;.  }else if( p2
11980 2d 3e 70 46 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pFd==0 ){.    
11990 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d 65 6c  iRes = i1;.  }el
119a0 73 65 7b 0a 20 20 20 20 53 6f 72 74 53 75 62 74  se{.    SortSubt
119b0 61 73 6b 20 2a 70 54 61 73 6b 20 3d 20 70 4d 65  ask *pTask = pMe
119c0 72 67 65 72 2d 3e 70 54 61 73 6b 3b 0a 20 20 20  rger->pTask;.   
119d0 20 69 6e 74 20 62 43 61 63 68 65 64 20 3d 20 30   int bCached = 0
119e0 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  ;.    int res;. 
119f0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 73 6b     assert( pTask
11a00 2d 3e 70 55 6e 70 61 63 6b 65 64 21 3d 30 20 29  ->pUnpacked!=0 )
11a10 3b 20 20 2f 2a 20 66 72 6f 6d 20 76 64 62 65 53  ;  /* from vdbeS
11a20 6f 72 74 53 75 62 74 61 73 6b 4d 61 69 6e 28 29  ortSubtaskMain()
11a30 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 54   */.    res = pT
11a40 61 73 6b 2d 3e 78 43 6f 6d 70 61 72 65 28 0a 20  ask->xCompare(. 
11a50 20 20 20 20 20 20 20 70 54 61 73 6b 2c 20 26 62         pTask, &b
11a60 43 61 63 68 65 64 2c 20 70 31 2d 3e 61 4b 65 79  Cached, p1->aKey
11a70 2c 20 70 31 2d 3e 6e 4b 65 79 2c 20 70 32 2d 3e  , p1->nKey, p2->
11a80 61 4b 65 79 2c 20 70 32 2d 3e 6e 4b 65 79 0a 20  aKey, p2->nKey. 
11a90 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65     );.    if( re
11aa0 73 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 52  s<=0 ){.      iR
11ab0 65 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c  es = i1;.    }el
11ac0 73 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d  se{.      iRes =
11ad0 20 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   i2;.    }.  }..
11ae0 20 20 70 4d 65 72 67 65 72 2d 3e 61 54 72 65 65    pMerger->aTree
11af0 5b 69 4f 75 74 5d 20 3d 20 69 52 65 73 3b 0a 7d  [iOut] = iRes;.}
11b00 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
11b10 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 65  values for the e
11b20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 74  Mode parameter t
11b30 6f 20 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e  o vdbeMergeEngin
11b40 65 49 6e 69 74 28 29 0a 2a 2a 20 61 6e 64 20 76  eInit().** and v
11b50 64 62 65 50 6d 61 52 65 61 64 65 72 49 6e 63 72  dbePmaReaderIncr
11b60 4d 65 72 67 65 49 6e 69 74 28 29 2e 0a 2a 2a 0a  MergeInit()..**.
11b70 2a 2a 20 4f 6e 6c 79 20 49 4e 43 52 49 4e 49 54  ** Only INCRINIT
11b80 5f 4e 4f 52 4d 41 4c 20 69 73 20 76 61 6c 69 64  _NORMAL is valid
11b90 20 69 6e 20 73 69 6e 67 6c 65 2d 74 68 72 65 61   in single-threa
11ba0 64 65 64 20 62 75 69 6c 64 73 20 28 77 68 65 6e  ded builds (when
11bb0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  .** SQLITE_MAX_W
11bc0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3d 3d 30  ORKER_THREADS==0
11bd0 29 2e 20 20 54 68 65 20 6f 74 68 65 72 20 76 61  ).  The other va
11be0 6c 75 65 73 20 61 72 65 20 6f 6e 6c 79 20 75 73  lues are only us
11bf0 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 72 65  ed.** when there
11c00 20 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d   exists one or m
11c10 6f 72 65 20 73 65 70 61 72 61 74 65 20 77 6f 72  ore separate wor
11c20 6b 65 72 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a  ker threads..*/.
11c30 23 64 65 66 69 6e 65 20 49 4e 43 52 49 4e 49 54  #define INCRINIT
11c40 5f 4e 4f 52 4d 41 4c 20 30 0a 23 64 65 66 69 6e  _NORMAL 0.#defin
11c50 65 20 49 4e 43 52 49 4e 49 54 5f 54 41 53 4b 20  e INCRINIT_TASK 
11c60 20 20 31 0a 23 64 65 66 69 6e 65 20 49 4e 43 52    1.#define INCR
11c70 49 4e 49 54 5f 52 4f 4f 54 20 20 20 32 0a 0a 2f  INIT_ROOT   2../
11c80 2a 20 0a 2a 2a 20 46 6f 72 77 61 72 64 20 72 65  * .** Forward re
11c90 66 65 72 65 6e 63 65 20 72 65 71 75 69 72 65 64  ference required
11ca0 20 61 73 20 74 68 65 20 76 64 62 65 49 6e 63 72   as the vdbeIncr
11cb0 4d 65 72 67 65 49 6e 69 74 28 29 20 61 6e 64 0a  MergeInit() and.
11cc0 2a 2a 20 76 64 62 65 50 6d 61 52 65 61 64 65 72  ** vdbePmaReader
11cd0 49 6e 63 72 49 6e 69 74 28 29 20 72 6f 75 74 69  IncrInit() routi
11ce0 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 6d  nes are called m
11cf0 75 74 75 61 6c 6c 79 20 72 65 63 75 72 73 69 76  utually recursiv
11d00 65 6c 79 20 77 68 65 6e 0a 2a 2a 20 62 75 69 6c  ely when.** buil
11d10 64 69 6e 67 20 61 20 6d 65 72 67 65 20 74 72 65  ding a merge tre
11d20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11d30 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 49 6e   vdbePmaReaderIn
11d40 63 72 49 6e 69 74 28 50 6d 61 52 65 61 64 65 72  crInit(PmaReader
11d50 20 2a 70 52 65 61 64 72 2c 20 69 6e 74 20 65 4d   *pReadr, int eM
11d60 6f 64 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ode);../*.** Ini
11d70 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 72 67  tialize the Merg
11d80 65 45 6e 67 69 6e 65 20 6f 62 6a 65 63 74 20 70  eEngine object p
11d90 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
11da0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 4f 6e  ond argument. On
11db0 63 65 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ce this.** funct
11dc0 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 74 68 65  ion returns, the
11dd0 20 66 69 72 73 74 20 6b 65 79 20 6f 66 20 6d 65   first key of me
11de0 72 67 65 64 20 64 61 74 61 20 6d 61 79 20 62 65  rged data may be
11df0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 0a   read from the .
11e00 2a 2a 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 6f  ** MergeEngine o
11e10 62 6a 65 63 74 20 69 6e 20 74 68 65 20 75 73 75  bject in the usu
11e20 61 6c 20 66 61 73 68 69 6f 6e 2e 0a 2a 2a 0a 2a  al fashion..**.*
11e30 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4d  * If argument eM
11e40 6f 64 65 20 69 73 20 49 4e 43 52 49 4e 49 54 5f  ode is INCRINIT_
11e50 52 4f 4f 54 2c 20 74 68 65 6e 20 69 74 20 69 73  ROOT, then it is
11e60 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 61 6e   assumed that an
11e70 79 20 49 6e 63 72 4d 65 72 67 65 0a 2a 2a 20 6f  y IncrMerge.** o
11e80 62 6a 65 63 74 73 20 61 74 74 61 63 68 65 64 20  bjects attached 
11e90 74 6f 20 74 68 65 20 50 6d 61 52 65 61 64 65 72  to the PmaReader
11ea0 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 74 68   objects that th
11eb0 65 20 6d 65 72 67 65 72 20 72 65 61 64 73 20 66  e merger reads f
11ec0 72 6f 6d 20 68 61 76 65 0a 2a 2a 20 61 6c 72 65  rom have.** alre
11ed0 61 64 79 20 62 65 65 6e 20 70 6f 70 75 6c 61 74  ady been populat
11ee0 65 64 2c 20 62 75 74 20 74 68 61 74 20 74 68 65  ed, but that the
11ef0 79 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 70  y have not yet p
11f00 6f 70 75 6c 61 74 65 64 20 61 46 69 6c 65 5b 30  opulated aFile[0
11f10 5d 20 61 6e 64 0a 2a 2a 20 73 65 74 20 74 68 65  ] and.** set the
11f20 20 50 6d 61 52 65 61 64 65 72 20 6f 62 6a 65 63   PmaReader objec
11f30 74 73 20 75 70 20 74 6f 20 72 65 61 64 20 66 72  ts up to read fr
11f40 6f 6d 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63  om it. In this c
11f50 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69 73 0a  ase all that is.
11f60 2a 2a 20 72 65 71 75 69 72 65 64 20 69 73 20 74  ** required is t
11f70 6f 20 63 61 6c 6c 20 76 64 62 65 50 6d 61 52 65  o call vdbePmaRe
11f80 61 64 65 72 4e 65 78 74 28 29 20 6f 6e 20 65 61  aderNext() on ea
11f90 63 68 20 50 6d 61 52 65 61 64 65 72 20 74 6f 20  ch PmaReader to 
11fa0 70 6f 69 6e 74 20 69 74 20 61 74 0a 2a 2a 20 69  point it at.** i
11fb0 74 73 20 66 69 72 73 74 20 6b 65 79 2e 0a 2a 2a  ts first key..**
11fc0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
11fd0 66 20 65 4d 6f 64 65 20 69 73 20 61 6e 79 20 76  f eMode is any v
11fe0 61 6c 75 65 20 6f 74 68 65 72 20 74 68 61 6e 20  alue other than 
11ff0 49 4e 43 52 49 4e 49 54 5f 52 4f 4f 54 2c 20 74  INCRINIT_ROOT, t
12000 68 65 6e 20 75 73 65 20 0a 2a 2a 20 76 64 62 65  hen use .** vdbe
12010 50 6d 61 52 65 61 64 65 72 49 6e 63 72 4d 65 72  PmaReaderIncrMer
12020 67 65 49 6e 69 74 28 29 20 74 6f 20 69 6e 69 74  geInit() to init
12030 69 61 6c 69 7a 65 20 65 61 63 68 20 50 6d 61 52  ialize each PmaR
12040 65 61 64 65 72 20 74 68 61 74 20 66 65 65 64 73  eader that feeds
12050 20 64 61 74 61 20 0a 2a 2a 20 74 6f 20 70 4d 65   data .** to pMe
12060 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  rger..**.** SQLI
12070 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
12080 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
12090 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
120a0 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
120b0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
120c0 74 20 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e  t vdbeMergeEngin
120d0 65 49 6e 69 74 28 0a 20 20 53 6f 72 74 53 75 62  eInit(.  SortSub
120e0 74 61 73 6b 20 2a 70 54 61 73 6b 2c 20 20 20 20  task *pTask,    
120f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 72 65           /* Thre
12100 61 64 20 74 68 61 74 20 77 69 6c 6c 20 72 75 6e  ad that will run
12110 20 70 4d 65 72 67 65 72 20 2a 2f 0a 20 20 4d 65   pMerger */.  Me
12120 72 67 65 45 6e 67 69 6e 65 20 2a 70 4d 65 72 67  rgeEngine *pMerg
12130 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er,           /*
12140 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 74 6f 20   MergeEngine to 
12150 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  initialize */.  
12160 69 6e 74 20 65 4d 6f 64 65 20 20 20 20 20 20 20  int eMode       
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 49 4e  /* One of the IN
12190 43 52 49 4e 49 54 5f 58 58 58 20 63 6f 6e 73 74  CRINIT_XXX const
121a0 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ants */.){.  int
121b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
121d0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
121e0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12200 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
12210 6f 76 65 72 20 50 6d 61 52 65 61 64 65 72 20 6f  over PmaReader o
12220 62 6a 65 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20  bjects */.  int 
12230 6e 54 72 65 65 20 3d 20 70 4d 65 72 67 65 72 2d  nTree = pMerger-
12240 3e 6e 54 72 65 65 3b 0a 0a 20 20 2f 2a 20 65 4d  >nTree;..  /* eM
12250 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 49 4e  ode is always IN
12260 43 52 49 4e 49 54 5f 4e 4f 52 4d 41 4c 20 69 6e  CRINIT_NORMAL in
12270 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
12280 20 6d 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72   mode */.  asser
12290 74 28 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  t( SQLITE_MAX_WO
122a0 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 20 7c  RKER_THREADS>0 |
122b0 7c 20 65 4d 6f 64 65 3d 3d 49 4e 43 52 49 4e 49  | eMode==INCRINI
122c0 54 5f 4e 4f 52 4d 41 4c 20 29 3b 0a 0a 20 20 2f  T_NORMAL );..  /
122d0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
122e0 65 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 69 73  e MergeEngine is
122f0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 20 73   assigned to a s
12300 69 6e 67 6c 65 20 74 68 72 65 61 64 20 2a 2f 0a  ingle thread */.
12310 20 20 61 73 73 65 72 74 28 20 70 4d 65 72 67 65    assert( pMerge
12320 72 2d 3e 70 54 61 73 6b 3d 3d 30 20 29 3b 0a 20  r->pTask==0 );. 
12330 20 70 4d 65 72 67 65 72 2d 3e 70 54 61 73 6b 20   pMerger->pTask 
12340 3d 20 70 54 61 73 6b 3b 0a 0a 20 20 66 6f 72 28  = pTask;..  for(
12350 69 3d 30 3b 20 69 3c 6e 54 72 65 65 3b 20 69 2b  i=0; i<nTree; i+
12360 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  +){.    if( SQLI
12370 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
12380 52 45 41 44 53 3e 30 20 26 26 20 65 4d 6f 64 65  READS>0 && eMode
12390 3d 3d 49 4e 43 52 49 4e 49 54 5f 52 4f 4f 54 20  ==INCRINIT_ROOT 
123a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 50 6d 61 52  ){.      /* PmaR
123b0 65 61 64 65 72 73 20 73 68 6f 75 6c 64 20 62 65  eaders should be
123c0 20 6e 6f 72 6d 61 6c 6c 79 20 69 6e 69 74 69 61   normally initia
123d0 6c 69 7a 65 64 20 69 6e 20 6f 72 64 65 72 2c 20  lized in order, 
123e0 61 73 20 69 66 20 74 68 65 79 20 61 72 65 0a 20  as if they are. 
123f0 20 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20       ** reading 
12400 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 74 65  from the same te
12410 6d 70 20 66 69 6c 65 20 74 68 69 73 20 6d 61 6b  mp file this mak
12420 65 73 20 66 6f 72 20 6d 6f 72 65 20 6c 69 6e 65  es for more line
12430 61 72 20 66 69 6c 65 20 49 4f 2e 0a 20 20 20 20  ar file IO..    
12440 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 6e    ** However, in
12450 20 74 68 65 20 49 4e 43 52 49 4e 49 54 5f 52 4f   the INCRINIT_RO
12460 4f 54 20 63 61 73 65 2c 20 69 66 20 50 6d 61 52  OT case, if PmaR
12470 65 61 64 65 72 20 61 52 65 61 64 72 5b 6e 54 61  eader aReadr[nTa
12480 73 6b 2d 31 5d 20 69 73 0a 20 20 20 20 20 20 2a  sk-1] is.      *
12490 2a 20 69 6e 20 75 73 65 20 69 74 20 77 69 6c 6c  * in use it will
124a0 20 62 6c 6f 63 6b 20 74 68 65 20 76 64 62 65 50   block the vdbeP
124b0 6d 61 52 65 61 64 65 72 4e 65 78 74 28 29 20 63  maReaderNext() c
124c0 61 6c 6c 20 77 68 69 6c 65 20 69 74 20 75 73 65  all while it use
124d0 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d  s.      ** the m
124e0 61 69 6e 20 74 68 72 65 61 64 20 74 6f 20 66 69  ain thread to fi
124f0 6c 6c 20 69 74 73 20 62 75 66 66 65 72 2e 20 53  ll its buffer. S
12500 6f 20 63 61 6c 6c 69 6e 67 20 50 6d 61 52 65 61  o calling PmaRea
12510 64 65 72 4e 65 78 74 28 29 0a 20 20 20 20 20 20  derNext().      
12520 2a 2a 20 6f 6e 20 74 68 69 73 20 50 6d 61 52 65  ** on this PmaRe
12530 61 64 65 72 20 62 65 66 6f 72 65 20 61 6e 79 20  ader before any 
12540 6f 66 20 74 68 65 20 6d 75 6c 74 69 2d 74 68 72  of the multi-thr
12550 65 61 64 65 64 20 50 6d 61 52 65 61 64 65 72 73  eaded PmaReaders
12560 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a 2a 20   takes.      ** 
12570 62 65 74 74 65 72 20 61 64 76 61 6e 74 61 67 65  better advantage
12580 20 6f 66 20 6d 75 6c 74 69 2d 70 72 6f 63 65 73   of multi-proces
12590 73 6f 72 20 68 61 72 64 77 61 72 65 2e 20 2a 2f  sor hardware. */
125a0 0a 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65  .      rc = vdbe
125b0 50 6d 61 52 65 61 64 65 72 4e 65 78 74 28 26 70  PmaReaderNext(&p
125c0 4d 65 72 67 65 72 2d 3e 61 52 65 61 64 72 5b 6e  Merger->aReadr[n
125d0 54 72 65 65 2d 69 2d 31 5d 29 3b 0a 20 20 20 20  Tree-i-1]);.    
125e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
125f0 3d 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 49  = vdbePmaReaderI
12600 6e 63 72 49 6e 69 74 28 26 70 4d 65 72 67 65 72  ncrInit(&pMerger
12610 2d 3e 61 52 65 61 64 72 5b 69 5d 2c 20 49 4e 43  ->aReadr[i], INC
12620 52 49 4e 49 54 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  RINIT_NORMAL);. 
12630 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
12640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
12650 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 66  urn rc;.  }..  f
12660 6f 72 28 69 3d 70 4d 65 72 67 65 72 2d 3e 6e 54  or(i=pMerger->nT
12670 72 65 65 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  ree-1; i>0; i--)
12680 7b 0a 20 20 20 20 76 64 62 65 4d 65 72 67 65 45  {.    vdbeMergeE
12690 6e 67 69 6e 65 43 6f 6d 70 61 72 65 28 70 4d 65  ngineCompare(pMe
126a0 72 67 65 72 2c 20 69 29 3b 0a 20 20 7d 0a 20 20  rger, i);.  }.  
126b0 72 65 74 75 72 6e 20 70 54 61 73 6b 2d 3e 70 55  return pTask->pU
126c0 6e 70 61 63 6b 65 64 2d 3e 65 72 72 43 6f 64 65  npacked->errCode
126d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50  ;.}../*.** The P
126e0 6d 61 52 65 61 64 65 72 20 70 61 73 73 65 64 20  maReader passed 
126f0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
12700 75 6d 65 6e 74 20 69 73 20 67 75 61 72 61 6e 74  ument is guarant
12710 65 65 64 20 74 6f 20 62 65 20 61 6e 0a 2a 2a 20  eed to be an.** 
12720 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 72 65 61 64  incremental-read
12730 65 72 20 28 70 52 65 61 64 72 2d 3e 70 49 6e 63  er (pReadr->pInc
12740 72 21 3d 30 29 2e 20 54 68 69 73 20 66 75 6e 63  r!=0). This func
12750 74 69 6f 6e 20 73 65 72 76 65 73 20 74 6f 20 6f  tion serves to o
12760 70 65 6e 0a 2a 2a 20 61 6e 64 2f 6f 72 20 69 6e  pen.** and/or in
12770 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 65 6d  itialize the tem
12780 70 20 66 69 6c 65 20 72 65 6c 61 74 65 64 20 66  p file related f
12790 69 65 6c 64 73 20 6f 66 20 74 68 65 20 49 6e 63  ields of the Inc
127a0 72 4d 65 72 67 65 0a 2a 2a 20 6f 62 6a 65 63 74  rMerge.** object
127b0 20 61 74 20 28 70 52 65 61 64 72 2d 3e 70 49 6e   at (pReadr->pIn
127c0 63 72 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  cr)..**.** If ar
127d0 67 75 6d 65 6e 74 20 65 4d 6f 64 65 20 69 73 20  gument eMode is 
127e0 73 65 74 20 74 6f 20 49 4e 43 52 49 4e 49 54 5f  set to INCRINIT_
127f0 4e 4f 52 4d 41 4c 2c 20 74 68 65 6e 20 61 6c 6c  NORMAL, then all
12800 20 50 6d 61 52 65 61 64 65 72 73 0a 2a 2a 20 69   PmaReaders.** i
12810 6e 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 68  n the sub-tree h
12820 65 61 64 65 64 20 62 79 20 70 52 65 61 64 72 20  eaded by pReadr 
12830 61 72 65 20 61 6c 73 6f 20 69 6e 69 74 69 61 6c  are also initial
12840 69 7a 65 64 2e 20 44 61 74 61 20 69 73 20 74 68  ized. Data is th
12850 65 6e 20 0a 2a 2a 20 6c 6f 61 64 65 64 20 69 6e  en .** loaded in
12860 74 6f 20 74 68 65 20 62 75 66 66 65 72 73 20 62  to the buffers b
12870 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 70 52 65 61  elonging to pRea
12880 64 72 20 61 6e 64 20 69 74 20 69 73 20 73 65 74  dr and it is set
12890 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 0a 2a 2a   to point to .**
128a0 20 74 68 65 20 66 69 72 73 74 20 6b 65 79 20 69   the first key i
128b0 6e 20 69 74 73 20 72 61 6e 67 65 2e 0a 2a 2a 0a  n its range..**.
128c0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
128d0 4d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 49  Mode is set to I
128e0 4e 43 52 49 4e 49 54 5f 54 41 53 4b 2c 20 74 68  NCRINIT_TASK, th
128f0 65 6e 20 70 52 65 61 64 72 20 69 73 20 67 75 61  en pReadr is gua
12900 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
12910 20 61 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65   a multi-threade
12920 64 20 50 6d 61 52 65 61 64 65 72 20 61 6e 64 20  d PmaReader and 
12930 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
12940 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 69 6e   being called in
12950 20 61 0a 2a 2a 20 62 61 63 6b 67 72 6f 75 6e 64   a.** background
12960 20 74 68 72 65 61 64 2e 20 49 6e 20 74 68 69 73   thread. In this
12970 20 63 61 73 65 20 61 6c 6c 20 50 6d 61 52 65 61   case all PmaRea
12980 64 65 72 73 20 69 6e 20 74 68 65 20 73 75 62 2d  ders in the sub-
12990 74 72 65 65 20 61 72 65 20 0a 2a 2a 20 69 6e 69  tree are .** ini
129a0 74 69 61 6c 69 7a 65 64 20 61 73 20 66 6f 72 20  tialized as for 
129b0 49 4e 43 52 49 4e 49 54 5f 4e 4f 52 4d 41 4c 20  INCRINIT_NORMAL 
129c0 61 6e 64 20 74 68 65 20 61 46 69 6c 65 5b 31 5d  and the aFile[1]
129d0 20 62 75 66 66 65 72 20 62 65 6c 6f 6e 67 69 6e   buffer belongin
129e0 67 20 74 6f 0a 2a 2a 20 70 52 65 61 64 72 20 69  g to.** pReadr i
129f0 73 20 70 6f 70 75 6c 61 74 65 64 2e 20 48 6f 77  s populated. How
12a00 65 76 65 72 2c 20 70 52 65 61 64 72 20 69 74 73  ever, pReadr its
12a10 65 6c 66 20 69 73 20 6e 6f 74 20 73 65 74 20 75  elf is not set u
12a20 70 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f  p to point.** to
12a30 20 69 74 73 20 66 69 72 73 74 20 6b 65 79 2e 20   its first key. 
12a40 41 20 63 61 6c 6c 20 74 6f 20 76 64 62 65 50 6d  A call to vdbePm
12a50 61 52 65 61 64 65 72 4e 65 78 74 28 29 20 69 73  aReaderNext() is
12a60 20 73 74 69 6c 6c 20 72 65 71 75 69 72 65 64 20   still required 
12a70 74 6f 20 64 6f 0a 2a 2a 20 74 68 61 74 2e 20 0a  to do.** that. .
12a80 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e  **.** The reason
12a90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
12aa0 6f 65 73 20 6e 6f 74 20 63 61 6c 6c 20 76 64 62  oes not call vdb
12ab0 65 50 6d 61 52 65 61 64 65 72 4e 65 78 74 28 29  ePmaReaderNext()
12ac0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
12ad0 20 69 6e 20 74 68 65 20 49 4e 43 52 49 4e 49 54   in the INCRINIT
12ae0 5f 54 41 53 4b 20 63 61 73 65 20 69 73 20 74 68  _TASK case is th
12af0 61 74 20 76 64 62 65 50 6d 61 52 65 61 64 65 72  at vdbePmaReader
12b00 4e 65 78 74 28 29 20 61 73 73 75 6d 65 73 20 74  Next() assumes t
12b10 68 61 74 20 69 74 20 68 61 73 0a 2a 2a 20 74 6f  hat it has.** to
12b20 20 62 6c 6f 63 6b 20 6f 6e 20 74 68 72 65 61 64   block on thread
12b30 20 28 70 54 61 73 6b 2d 3e 74 68 72 65 61 64 29   (pTask->thread)
12b40 20 62 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e   before accessin
12b50 67 20 61 46 69 6c 65 5b 31 5d 2e 20 42 75 74 2c  g aFile[1]. But,
12b60 20 73 69 6e 63 65 0a 2a 2a 20 74 68 69 73 20 65   since.** this e
12b70 6e 74 69 72 65 20 66 75 6e 63 74 69 6f 6e 20 69  ntire function i
12b80 73 20 62 65 69 6e 67 20 72 75 6e 20 62 79 20 74  s being run by t
12b90 68 72 65 61 64 20 28 70 54 61 73 6b 2d 3e 74 68  hread (pTask->th
12ba0 72 65 61 64 29 2c 20 74 68 61 74 20 77 69 6c 6c  read), that will
12bb0 0a 2a 2a 20 6c 65 61 64 20 74 6f 20 74 68 65 20  .** lead to the 
12bc0 63 75 72 72 65 6e 74 20 62 61 63 6b 67 72 6f 75  current backgrou
12bd0 6e 64 20 74 68 72 65 61 64 20 61 74 74 65 6d 70  nd thread attemp
12be0 74 69 6e 67 20 74 6f 20 6a 6f 69 6e 20 69 74 73  ting to join its
12bf0 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c  elf..**.** Final
12c00 6c 79 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20  ly, if argument 
12c10 65 4d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  eMode is set to 
12c20 49 4e 43 52 49 4e 49 54 5f 52 4f 4f 54 2c 20 69  INCRINIT_ROOT, i
12c30 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64  t may be assumed
12c40 0a 2a 2a 20 74 68 61 74 20 70 52 65 61 64 72 2d  .** that pReadr-
12c50 3e 70 49 6e 63 72 20 69 73 20 61 20 6d 75 6c 74  >pIncr is a mult
12c60 69 2d 74 68 72 65 61 64 65 64 20 49 6e 63 72 4d  i-threaded IncrM
12c70 65 72 67 65 20 6f 62 6a 65 63 74 73 2c 20 61 6e  erge objects, an
12c80 64 20 74 68 61 74 20 61 6c 6c 0a 2a 2a 20 63 68  d that all.** ch
12c90 69 6c 64 2d 74 72 65 65 73 20 68 61 76 65 20 61  ild-trees have a
12ca0 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 69 74  lready been init
12cb0 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 49 6e  ialized using In
12cc0 63 72 49 6e 69 74 28 49 4e 43 52 49 4e 49 54 5f  crInit(INCRINIT_
12cd0 54 41 53 4b 29 2e 0a 2a 2a 20 49 6e 20 74 68 69  TASK)..** In thi
12ce0 73 20 63 61 73 65 20 76 64 62 65 50 6d 61 52 65  s case vdbePmaRe
12cf0 61 64 65 72 4e 65 78 74 28 29 20 69 73 20 63 61  aderNext() is ca
12d00 6c 6c 65 64 20 6f 6e 20 61 6c 6c 20 63 68 69 6c  lled on all chil
12d10 64 20 50 6d 61 52 65 61 64 65 72 73 20 61 6e 64  d PmaReaders and
12d20 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
12d30 50 6d 61 52 65 61 64 65 72 20 73 65 74 20 74 6f  PmaReader set to
12d40 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
12d50 72 73 74 20 6b 65 79 20 69 6e 20 69 74 73 20 72  rst key in its r
12d60 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  ange..**.** SQLI
12d70 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
12d80 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
12d90 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
12da0 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
12db0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
12dc0 74 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 49  t vdbePmaReaderI
12dd0 6e 63 72 4d 65 72 67 65 49 6e 69 74 28 50 6d 61  ncrMergeInit(Pma
12de0 52 65 61 64 65 72 20 2a 70 52 65 61 64 72 2c 20  Reader *pReadr, 
12df0 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 69 6e  int eMode){.  in
12e00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12e10 3b 0a 20 20 49 6e 63 72 4d 65 72 67 65 72 20 2a  ;.  IncrMerger *
12e20 70 49 6e 63 72 20 3d 20 70 52 65 61 64 72 2d 3e  pIncr = pReadr->
12e30 70 49 6e 63 72 3b 0a 20 20 53 6f 72 74 53 75 62  pIncr;.  SortSub
12e40 74 61 73 6b 20 2a 70 54 61 73 6b 20 3d 20 70 49  task *pTask = pI
12e50 6e 63 72 2d 3e 70 54 61 73 6b 3b 0a 20 20 73 71  ncr->pTask;.  sq
12e60 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 54 61 73  lite3 *db = pTas
12e70 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 64 62 3b 0a  k->pSorter->db;.
12e80 0a 20 20 2f 2a 20 65 4d 6f 64 65 20 69 73 20 61  .  /* eMode is a
12e90 6c 77 61 79 73 20 49 4e 43 52 49 4e 49 54 5f 4e  lways INCRINIT_N
12ea0 4f 52 4d 41 4c 20 69 6e 20 73 69 6e 67 6c 65 2d  ORMAL in single-
12eb0 74 68 72 65 61 64 65 64 20 6d 6f 64 65 20 2a 2f  threaded mode */
12ec0 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
12ed0 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
12ee0 45 41 44 53 3e 30 20 7c 7c 20 65 4d 6f 64 65 3d  EADS>0 || eMode=
12ef0 3d 49 4e 43 52 49 4e 49 54 5f 4e 4f 52 4d 41 4c  =INCRINIT_NORMAL
12f00 20 29 3b 0a 0a 20 20 72 63 20 3d 20 76 64 62 65   );..  rc = vdbe
12f10 4d 65 72 67 65 45 6e 67 69 6e 65 49 6e 69 74 28  MergeEngineInit(
12f20 70 54 61 73 6b 2c 20 70 49 6e 63 72 2d 3e 70 4d  pTask, pIncr->pM
12f30 65 72 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 0a  erger, eMode);..
12f40 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
12f50 72 65 71 75 69 72 65 64 20 66 69 6c 65 73 20 66  required files f
12f60 6f 72 20 70 49 6e 63 72 2e 20 41 20 6d 75 6c 74  or pIncr. A mult
12f70 69 2d 74 68 65 61 64 65 64 20 49 6e 63 72 4d 65  i-theaded IncrMe
12f80 72 67 65 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20  rge object.  ** 
12f90 72 65 71 75 69 72 65 73 20 74 77 6f 20 74 65 6d  requires two tem
12fa0 70 20 66 69 6c 65 73 20 74 6f 20 69 74 73 65 6c  p files to itsel
12fb0 66 2c 20 77 68 65 72 65 61 73 20 61 20 73 69 6e  f, whereas a sin
12fc0 67 6c 65 2d 74 68 72 65 61 64 65 64 20 6f 62 6a  gle-threaded obj
12fd0 65 63 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65  ect.  ** only re
12fe0 71 75 69 72 65 73 20 61 20 72 65 67 69 6f 6e 20  quires a region 
12ff0 6f 66 20 70 54 61 73 6b 2d 3e 66 69 6c 65 32 2e  of pTask->file2.
13000 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
13010 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
13020 6e 74 20 6d 78 53 7a 20 3d 20 70 49 6e 63 72 2d  nt mxSz = pIncr-
13030 3e 6d 78 53 7a 3b 0a 23 69 66 20 53 51 4c 49 54  >mxSz;.#if SQLIT
13040 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
13050 45 41 44 53 3e 30 0a 20 20 20 20 69 66 28 20 70  EADS>0.    if( p
13060 49 6e 63 72 2d 3e 62 55 73 65 54 68 72 65 61 64  Incr->bUseThread
13070 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 76   ){.      rc = v
13080 64 62 65 53 6f 72 74 65 72 4f 70 65 6e 54 65 6d  dbeSorterOpenTem
13090 70 46 69 6c 65 28 64 62 2c 20 6d 78 53 7a 2c 20  pFile(db, mxSz, 
130a0 26 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 30 5d  &pIncr->aFile[0]
130b0 2e 70 46 64 29 3b 0a 20 20 20 20 20 20 69 66 28  .pFd);.      if(
130c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
130d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 76  {.        rc = v
130e0 64 62 65 53 6f 72 74 65 72 4f 70 65 6e 54 65 6d  dbeSorterOpenTem
130f0 70 46 69 6c 65 28 64 62 2c 20 6d 78 53 7a 2c 20  pFile(db, mxSz, 
13100 26 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 31 5d  &pIncr->aFile[1]
13110 2e 70 46 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  .pFd);.      }. 
13120 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
13130 20 20 20 20 2f 2a 69 66 28 20 21 70 49 6e 63 72      /*if( !pIncr
13140 2d 3e 62 55 73 65 54 68 72 65 61 64 20 29 2a 2f  ->bUseThread )*/
13150 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 73  {.      if( pTas
13160 6b 2d 3e 66 69 6c 65 32 2e 70 46 64 3d 3d 30 20  k->file2.pFd==0 
13170 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
13180 74 28 20 70 54 61 73 6b 2d 3e 66 69 6c 65 32 2e  t( pTask->file2.
13190 69 45 6f 66 3e 30 20 29 3b 0a 20 20 20 20 20 20  iEof>0 );.      
131a0 20 20 72 63 20 3d 20 76 64 62 65 53 6f 72 74 65    rc = vdbeSorte
131b0 72 4f 70 65 6e 54 65 6d 70 46 69 6c 65 28 64 62  rOpenTempFile(db
131c0 2c 20 70 54 61 73 6b 2d 3e 66 69 6c 65 32 2e 69  , pTask->file2.i
131d0 45 6f 66 2c 20 26 70 54 61 73 6b 2d 3e 66 69 6c  Eof, &pTask->fil
131e0 65 32 2e 70 46 64 29 3b 0a 20 20 20 20 20 20 20  e2.pFd);.       
131f0 20 70 54 61 73 6b 2d 3e 66 69 6c 65 32 2e 69 45   pTask->file2.iE
13200 6f 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  of = 0;.      }.
13210 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
13220 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13230 20 20 20 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b     pIncr->aFile[
13240 31 5d 2e 70 46 64 20 3d 20 70 54 61 73 6b 2d 3e  1].pFd = pTask->
13250 66 69 6c 65 32 2e 70 46 64 3b 0a 20 20 20 20 20  file2.pFd;.     
13260 20 20 20 70 49 6e 63 72 2d 3e 69 53 74 61 72 74     pIncr->iStart
13270 4f 66 66 20 3d 20 70 54 61 73 6b 2d 3e 66 69 6c  Off = pTask->fil
13280 65 32 2e 69 45 6f 66 3b 0a 20 20 20 20 20 20 20  e2.iEof;.       
13290 20 70 54 61 73 6b 2d 3e 66 69 6c 65 32 2e 69 45   pTask->file2.iE
132a0 6f 66 20 2b 3d 20 6d 78 53 7a 3b 0a 20 20 20 20  of += mxSz;.    
132b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23    }.    }.  }..#
132c0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  if SQLITE_MAX_WO
132d0 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 0a 20  RKER_THREADS>0. 
132e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
132f0 4f 4b 20 26 26 20 70 49 6e 63 72 2d 3e 62 55 73  OK && pIncr->bUs
13300 65 54 68 72 65 61 64 20 29 7b 0a 20 20 20 20 2f  eThread ){.    /
13310 2a 20 55 73 65 20 74 68 65 20 63 75 72 72 65 6e  * Use the curren
13320 74 20 74 68 72 65 61 64 20 74 6f 20 70 6f 70 75  t thread to popu
13330 6c 61 74 65 20 61 46 69 6c 65 5b 31 5d 2c 20 65  late aFile[1], e
13340 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 0a  ven though this.
13350 20 20 20 20 2a 2a 20 50 6d 61 52 65 61 64 65 72      ** PmaReader
13360 20 69 73 20 6d 75 6c 74 69 2d 74 68 72 65 61 64   is multi-thread
13370 65 64 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ed. If this is a
13380 6e 20 49 4e 43 52 49 4e 49 54 5f 54 41 53 4b 20  n INCRINIT_TASK 
13390 6f 62 6a 65 63 74 2c 0a 20 20 20 20 2a 2a 20 74  object,.    ** t
133a0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
133b0 6e 20 69 73 20 61 6c 72 65 61 64 79 20 72 75 6e  n is already run
133c0 6e 69 6e 67 20 69 6e 20 62 61 63 6b 67 72 6f 75  ning in backgrou
133d0 6e 64 20 74 68 72 65 61 64 20 0a 20 20 20 20 2a  nd thread .    *
133e0 2a 20 70 49 6e 63 72 2d 3e 70 54 61 73 6b 2d 3e  * pIncr->pTask->
133f0 74 68 72 65 61 64 2e 20 0a 20 20 20 20 2a 2a 0a  thread. .    **.
13400 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
13410 73 20 74 68 65 20 49 4e 43 52 49 4e 49 54 5f 52  s the INCRINIT_R
13420 4f 4f 54 20 6f 62 6a 65 63 74 2c 20 74 68 65 6e  OOT object, then
13430 20 69 74 20 69 73 20 72 75 6e 6e 69 6e 67 20 69   it is running i
13440 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 6d 61  n the .    ** ma
13450 69 6e 20 56 44 42 45 20 74 68 72 65 61 64 2e 20  in VDBE thread. 
13460 42 75 74 20 74 68 61 74 20 69 73 20 4f 6b 2c 20  But that is Ok, 
13470 61 73 20 74 68 61 74 20 74 68 72 65 61 64 20 63  as that thread c
13480 61 6e 6e 6f 74 20 72 65 74 75 72 6e 0a 20 20 20  annot return.   
13490 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74   ** control to t
134a0 68 65 20 56 44 42 45 20 6f 72 20 70 72 6f 63 65  he VDBE or proce
134b0 65 64 20 77 69 74 68 20 61 6e 79 74 68 69 6e 67  ed with anything
134c0 20 75 73 65 66 75 6c 20 75 6e 74 69 6c 20 74 68   useful until th
134d0 65 20 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  e .    ** first 
134e0 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 61 64  results are read
134f0 79 20 66 72 6f 6d 20 74 68 69 73 20 6d 65 72 67  y from this merg
13500 65 72 20 6f 62 6a 65 63 74 20 61 6e 79 77 61 79  er object anyway
13510 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
13520 65 72 74 28 20 65 4d 6f 64 65 3d 3d 49 4e 43 52  ert( eMode==INCR
13530 49 4e 49 54 5f 52 4f 4f 54 20 7c 7c 20 65 4d 6f  INIT_ROOT || eMo
13540 64 65 3d 3d 49 4e 43 52 49 4e 49 54 5f 54 41 53  de==INCRINIT_TAS
13550 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 76 64  K );.    rc = vd
13560 62 65 49 6e 63 72 50 6f 70 75 6c 61 74 65 28 70  beIncrPopulate(p
13570 49 6e 63 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Incr);.  }.#endi
13580 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  f..  if( rc==SQL
13590 49 54 45 5f 4f 4b 20 26 26 20 28 53 51 4c 49 54  ITE_OK && (SQLIT
135a0 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
135b0 45 41 44 53 3d 3d 30 20 7c 7c 20 65 4d 6f 64 65  EADS==0 || eMode
135c0 21 3d 49 4e 43 52 49 4e 49 54 5f 54 41 53 4b 29  !=INCRINIT_TASK)
135d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 76 64 62   ){.    rc = vdb
135e0 65 50 6d 61 52 65 61 64 65 72 4e 65 78 74 28 70  ePmaReaderNext(p
135f0 52 65 61 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  Readr);.  }..  r
13600 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
13610 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
13620 45 52 5f 54 48 52 45 41 44 53 3e 30 0a 2f 2a 0a  ER_THREADS>0./*.
13630 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 75 74  ** The main rout
13640 69 6e 65 20 66 6f 72 20 76 64 62 65 50 6d 61 52  ine for vdbePmaR
13650 65 61 64 65 72 49 6e 63 72 4d 65 72 67 65 49 6e  eaderIncrMergeIn
13660 69 74 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 20  it() operations 
13670 72 75 6e 20 69 6e 20 0a 2a 2a 20 62 61 63 6b 67  run in .** backg
13680 72 6f 75 6e 64 20 74 68 72 65 61 64 73 2e 0a 2a  round threads..*
13690 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 76  /.static void *v
136a0 64 62 65 50 6d 61 52 65 61 64 65 72 42 67 49 6e  dbePmaReaderBgIn
136b0 63 72 49 6e 69 74 28 76 6f 69 64 20 2a 70 43 74  crInit(void *pCt
136c0 78 29 7b 0a 20 20 50 6d 61 52 65 61 64 65 72 20  x){.  PmaReader 
136d0 2a 70 52 65 61 64 65 72 20 3d 20 28 50 6d 61 52  *pReader = (PmaR
136e0 65 61 64 65 72 2a 29 70 43 74 78 3b 0a 20 20 76  eader*)pCtx;.  v
136f0 6f 69 64 20 2a 70 52 65 74 20 3d 20 53 51 4c 49  oid *pRet = SQLI
13700 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 0a 20  TE_INT_TO_PTR(. 
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 49 6e   vdbePmaReaderIn
13730 63 72 4d 65 72 67 65 49 6e 69 74 28 70 52 65 61  crMergeInit(pRea
13740 64 65 72 2c 49 4e 43 52 49 4e 49 54 5f 54 41 53  der,INCRINIT_TAS
13750 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K).             
13760 20 20 29 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e    );.  pReader->
13770 70 49 6e 63 72 2d 3e 70 54 61 73 6b 2d 3e 62 44  pIncr->pTask->bD
13780 6f 6e 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  one = 1;.  retur
13790 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n pRet;.}.#endif
137a0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ../*.** If the P
137b0 6d 61 52 65 61 64 65 72 20 70 61 73 73 65 64 20  maReader passed 
137c0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
137d0 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 6e 20  ument is not an 
137e0 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 72 65 61 64  incremental-read
137f0 65 72 0a 2a 2a 20 28 69 66 20 70 52 65 61 64 72  er.** (if pReadr
13800 2d 3e 70 49 6e 63 72 3d 3d 30 29 2c 20 74 68 65  ->pIncr==0), the
13810 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
13820 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
13830 72 77 69 73 65 2c 20 69 74 20 69 6e 76 6f 6b 65  rwise, it invoke
13840 73 0a 2a 2a 20 74 68 65 20 76 64 62 65 50 6d 61  s.** the vdbePma
13850 52 65 61 64 65 72 49 6e 63 72 4d 65 72 67 65 49  ReaderIncrMergeI
13860 6e 69 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 77  nit() function w
13870 69 74 68 20 74 68 65 20 70 61 72 61 6d 65 74 65  ith the paramete
13880 72 73 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20  rs passed to.** 
13890 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
138a0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69  initialize the i
138b0 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65  ncremental merge
138c0 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
138d0 49 6e 63 72 4d 65 72 67 65 72 20 6f 62 6a 65 63  IncrMerger objec
138e0 74 20 69 73 20 6d 75 6c 74 69 2d 74 68 72 65 61  t is multi-threa
138f0 64 65 64 20 28 49 6e 63 72 4d 65 72 67 65 72 2e  ded (IncrMerger.
13900 62 55 73 65 54 68 72 65 61 64 3d 3d 31 29 2c 20  bUseThread==1), 
13910 0a 2a 2a 20 74 68 65 6e 20 61 20 62 61 63 6b 67  .** then a backg
13920 72 6f 75 6e 64 20 74 68 72 65 61 64 20 69 73 20  round thread is 
13930 6c 61 75 6e 63 68 65 64 20 74 6f 20 63 61 6c 6c  launched to call
13940 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 49 6e   vdbePmaReaderIn
13950 63 72 4d 65 72 67 65 49 6e 69 74 28 29 2e 0a 2a  crMergeInit()..*
13960 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 49 6e 63  * Or, if the Inc
13970 72 4d 65 72 67 65 72 20 69 73 20 73 69 6e 67 6c  rMerger is singl
13980 65 20 74 68 72 65 61 64 65 64 2c 20 74 68 65 20  e threaded, the 
13990 73 61 6d 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  same function is
139a0 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 73 69 6e 67   called.** using
139b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
139c0 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ead..*/.static i
139d0 6e 74 20 76 64 62 65 50 6d 61 52 65 61 64 65 72  nt vdbePmaReader
139e0 49 6e 63 72 49 6e 69 74 28 50 6d 61 52 65 61 64  IncrInit(PmaRead
139f0 65 72 20 2a 70 52 65 61 64 72 2c 20 69 6e 74 20  er *pReadr, int 
13a00 65 4d 6f 64 65 29 7b 0a 20 20 49 6e 63 72 4d 65  eMode){.  IncrMe
13a10 72 67 65 72 20 2a 70 49 6e 63 72 20 3d 20 70 52  rger *pIncr = pR
13a20 65 61 64 72 2d 3e 70 49 6e 63 72 3b 20 20 20 2f  eadr->pIncr;   /
13a30 2a 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  * Incremental me
13a40 72 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  rger */.  int rc
13a50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13a70 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
13a80 0a 20 20 69 66 28 20 70 49 6e 63 72 20 29 7b 0a  .  if( pIncr ){.
13a90 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  #if SQLITE_MAX_W
13aa0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 0a  ORKER_THREADS>0.
13ab0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 63      assert( pInc
13ac0 72 2d 3e 62 55 73 65 54 68 72 65 61 64 3d 3d 30  r->bUseThread==0
13ad0 20 7c 7c 20 65 4d 6f 64 65 3d 3d 49 4e 43 52 49   || eMode==INCRI
13ae0 4e 49 54 5f 54 41 53 4b 20 29 3b 0a 20 20 20 20  NIT_TASK );.    
13af0 69 66 28 20 70 49 6e 63 72 2d 3e 62 55 73 65 54  if( pIncr->bUseT
13b00 68 72 65 61 64 20 29 7b 0a 20 20 20 20 20 20 76  hread ){.      v
13b10 6f 69 64 20 2a 70 43 74 78 20 3d 20 28 76 6f 69  oid *pCtx = (voi
13b20 64 2a 29 70 52 65 61 64 72 3b 0a 20 20 20 20 20  d*)pReadr;.     
13b30 20 72 63 20 3d 20 76 64 62 65 53 6f 72 74 65 72   rc = vdbeSorter
13b40 43 72 65 61 74 65 54 68 72 65 61 64 28 70 49 6e  CreateThread(pIn
13b50 63 72 2d 3e 70 54 61 73 6b 2c 20 76 64 62 65 50  cr->pTask, vdbeP
13b60 6d 61 52 65 61 64 65 72 42 67 49 6e 63 72 49 6e  maReaderBgIncrIn
13b70 69 74 2c 20 70 43 74 78 29 3b 0a 20 20 20 20 7d  it, pCtx);.    }
13b80 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
13b90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 76 64 62  {.      rc = vdb
13ba0 65 50 6d 61 52 65 61 64 65 72 49 6e 63 72 4d 65  ePmaReaderIncrMe
13bb0 72 67 65 49 6e 69 74 28 70 52 65 61 64 72 2c 20  rgeInit(pReadr, 
13bc0 65 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eMode);.    }.  
13bd0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
13be0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
13bf0 20 61 20 6e 65 77 20 4d 65 72 67 65 45 6e 67 69   a new MergeEngi
13c00 6e 65 20 6f 62 6a 65 63 74 20 74 6f 20 6d 65 72  ne object to mer
13c10 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ge the contents 
13c20 6f 66 20 6e 50 4d 41 20 6c 65 76 65 6c 2d 30 0a  of nPMA level-0.
13c30 2a 2a 20 50 4d 41 73 20 66 72 6f 6d 20 70 54 61  ** PMAs from pTa
13c40 73 6b 2d 3e 66 69 6c 65 2e 20 49 66 20 6e 6f 20  sk->file. If no 
13c50 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
13c60 74 20 2a 70 70 4f 75 74 20 74 6f 20 70 6f 69 6e  t *ppOut to poin
13c70 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20  t to.** the new 
13c80 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
13c90 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72 2c  n SQLITE_OK. Or,
13ca0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   if an error doe
13cb0 73 20 6f 63 63 75 72 2c 20 73 65 74 20 2a 70 70  s occur, set *pp
13cc0 4f 75 74 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 61  Out.** to NULL a
13cd0 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
13ce0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
13cf0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
13d00 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
13d10 65 64 2c 20 2a 70 69 4f 66 66 73 65 74 20 69 73  ed, *piOffset is
13d20 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
13d30 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72  et of the.** fir
13d40 73 74 20 50 4d 41 20 74 6f 20 72 65 61 64 20 66  st PMA to read f
13d50 72 6f 6d 20 70 54 61 73 6b 2d 3e 66 69 6c 65 2e  rom pTask->file.
13d60 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   Assuming no err
13d70 6f 72 20 6f 63 63 75 72 73 2c 20 69 74 20 69 73  or occurs, it is
13d80 20 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20   .** set to the 
13d90 6f 66 66 73 65 74 20 69 6d 6d 65 64 69 61 74 65  offset immediate
13da0 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
13db0 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 74 68   last byte of th
13dc0 65 20 6c 61 73 74 0a 2a 2a 20 50 4d 41 20 62 65  e last.** PMA be
13dd0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
13de0 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  If an error does
13df0 20 6f 63 63 75 72 2c 20 74 68 65 6e 20 74 68 65   occur, then the
13e00 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 0a   final value of.
13e10 2a 2a 20 2a 70 69 4f 66 66 73 65 74 20 69 73 20  ** *piOffset is 
13e20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
13e30 61 74 69 63 20 69 6e 74 20 76 64 62 65 4d 65 72  atic int vdbeMer
13e40 67 65 45 6e 67 69 6e 65 4c 65 76 65 6c 30 28 0a  geEngineLevel0(.
13e50 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70    SortSubtask *p
13e60 54 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Task,           
13e70 20 20 2f 2a 20 53 6f 72 74 65 72 20 74 61 73 6b    /* Sorter task
13e80 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
13e90 0a 20 20 69 6e 74 20 6e 50 4d 41 2c 20 20 20 20  .  int nPMA,    
13ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13eb0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13ec0 50 4d 41 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a  PMAs to read */.
13ed0 20 20 69 36 34 20 2a 70 69 4f 66 66 73 65 74 2c    i64 *piOffset,
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ef0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 52 65 61    /* IN/OUT: Rea
13f00 64 72 20 6f 66 66 73 65 74 20 69 6e 20 70 54 61  dr offset in pTa
13f10 73 6b 2d 3e 66 69 6c 65 20 2a 2f 0a 20 20 4d 65  sk->file */.  Me
13f20 72 67 65 45 6e 67 69 6e 65 20 2a 2a 70 70 4f 75  rgeEngine **ppOu
13f30 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
13f40 20 4f 55 54 3a 20 4e 65 77 20 6d 65 72 67 65 2d   OUT: New merge-
13f50 65 6e 67 69 6e 65 20 2a 2f 0a 29 7b 0a 20 20 4d  engine */.){.  M
13f60 65 72 67 65 45 6e 67 69 6e 65 20 2a 70 4e 65 77  ergeEngine *pNew
13f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
13f80 2a 20 4d 65 72 67 65 20 65 6e 67 69 6e 65 20 74  * Merge engine t
13f90 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 36  o return */.  i6
13fa0 34 20 69 4f 66 66 20 3d 20 2a 70 69 4f 66 66 73  4 iOff = *piOffs
13fb0 65 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  et;.  int i;.  i
13fc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13fd0 4b 3b 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70  K;..  *ppOut = p
13fe0 4e 65 77 20 3d 20 76 64 62 65 4d 65 72 67 65 45  New = vdbeMergeE
13ff0 6e 67 69 6e 65 4e 65 77 28 6e 50 4d 41 29 3b 0a  ngineNew(nPMA);.
14000 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
14010 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
14020 4d 5f 42 4b 50 54 3b 0a 0a 20 20 66 6f 72 28 69  M_BKPT;..  for(i
14030 3d 30 3b 20 69 3c 6e 50 4d 41 20 26 26 20 72 63  =0; i<nPMA && rc
14040 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
14050 29 7b 0a 20 20 20 20 69 36 34 20 6e 44 75 6d 6d  ){.    i64 nDumm
14060 79 20 3d 20 30 3b 0a 20 20 20 20 50 6d 61 52 65  y = 0;.    PmaRe
14070 61 64 65 72 20 2a 70 52 65 61 64 72 20 3d 20 26  ader *pReadr = &
14080 70 4e 65 77 2d 3e 61 52 65 61 64 72 5b 69 5d 3b  pNew->aReadr[i];
14090 0a 20 20 20 20 72 63 20 3d 20 76 64 62 65 50 6d  .    rc = vdbePm
140a0 61 52 65 61 64 65 72 49 6e 69 74 28 70 54 61 73  aReaderInit(pTas
140b0 6b 2c 20 26 70 54 61 73 6b 2d 3e 66 69 6c 65 2c  k, &pTask->file,
140c0 20 69 4f 66 66 2c 20 70 52 65 61 64 72 2c 20 26   iOff, pReadr, &
140d0 6e 44 75 6d 6d 79 29 3b 0a 20 20 20 20 69 4f 66  nDummy);.    iOf
140e0 66 20 3d 20 70 52 65 61 64 72 2d 3e 69 45 6f 66  f = pReadr->iEof
140f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
14100 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14110 20 20 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e    vdbeMergeEngin
14120 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  eFree(pNew);.   
14130 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20 7d   *ppOut = 0;.  }
14140 0a 20 20 2a 70 69 4f 66 66 73 65 74 20 3d 20 69  .  *piOffset = i
14150 4f 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Off;.  return rc
14160 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
14170 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 61  n the depth of a
14180 20 74 72 65 65 20 63 6f 6d 70 72 69 73 69 6e 67   tree comprising
14190 20 6e 50 4d 41 20 50 4d 41 73 2c 20 61 73 73 75   nPMA PMAs, assu
141a0 6d 69 6e 67 20 61 20 66 61 6e 6f 75 74 20 6f 66  ming a fanout of
141b0 0a 2a 2a 20 53 4f 52 54 45 52 5f 4d 41 58 5f 4d  .** SORTER_MAX_M
141c0 45 52 47 45 5f 43 4f 55 4e 54 2e 20 54 68 65 20  ERGE_COUNT. The 
141d0 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 64  returned value d
141e0 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  oes not include 
141f0 6c 65 61 66 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a  leaf nodes..**.*
14200 2a 20 69 2e 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6e  * i.e..**.**   n
14210 50 4d 41 3c 3d 31 36 20 20 20 20 2d 3e 20 54 72  PMA<=16    -> Tr
14220 65 65 44 65 70 74 68 28 29 20 3d 3d 20 30 0a 2a  eeDepth() == 0.*
14230 2a 20 20 20 6e 50 4d 41 3c 3d 32 35 36 20 20 20  *   nPMA<=256   
14240 2d 3e 20 54 72 65 65 44 65 70 74 68 28 29 20 3d  -> TreeDepth() =
14250 3d 20 31 0a 2a 2a 20 20 20 6e 50 4d 41 3c 3d 36  = 1.**   nPMA<=6
14260 35 35 33 36 20 2d 3e 20 54 72 65 65 44 65 70 74  5536 -> TreeDept
14270 68 28 29 20 3d 3d 20 32 0a 2a 2f 0a 73 74 61 74  h() == 2.*/.stat
14280 69 63 20 69 6e 74 20 76 64 62 65 53 6f 72 74 65  ic int vdbeSorte
14290 72 54 72 65 65 44 65 70 74 68 28 69 6e 74 20 6e  rTreeDepth(int n
142a0 50 4d 41 29 7b 0a 20 20 69 6e 74 20 6e 44 65 70  PMA){.  int nDep
142b0 74 68 20 3d 20 30 3b 0a 20 20 69 36 34 20 6e 44  th = 0;.  i64 nD
142c0 69 76 20 3d 20 53 4f 52 54 45 52 5f 4d 41 58 5f  iv = SORTER_MAX_
142d0 4d 45 52 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 77  MERGE_COUNT;.  w
142e0 68 69 6c 65 28 20 6e 44 69 76 20 3c 20 28 69 36  hile( nDiv < (i6
142f0 34 29 6e 50 4d 41 20 29 7b 0a 20 20 20 20 6e 44  4)nPMA ){.    nD
14300 69 76 20 3d 20 6e 44 69 76 20 2a 20 53 4f 52 54  iv = nDiv * SORT
14310 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55  ER_MAX_MERGE_COU
14320 4e 54 3b 0a 20 20 20 20 6e 44 65 70 74 68 2b 2b  NT;.    nDepth++
14330 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
14340 44 65 70 74 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Depth;.}../*.** 
14350 70 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f 6f  pRoot is the roo
14360 74 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  t of an incremen
14370 74 61 6c 20 6d 65 72 67 65 2d 74 72 65 65 20 77  tal merge-tree w
14380 69 74 68 20 64 65 70 74 68 20 6e 44 65 70 74 68  ith depth nDepth
14390 20 28 61 63 63 6f 72 64 69 6e 67 0a 2a 2a 20 74   (according.** t
143a0 6f 20 76 64 62 65 53 6f 72 74 65 72 54 72 65 65  o vdbeSorterTree
143b0 44 65 70 74 68 28 29 29 2e 20 70 4c 65 61 66 20  Depth()). pLeaf 
143c0 69 73 20 74 68 65 20 69 53 65 71 27 74 68 20 6c  is the iSeq'th l
143d0 65 61 66 20 74 6f 20 62 65 20 61 64 64 65 64 20  eaf to be added 
143e0 74 6f 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20  to the.** tree, 
143f0 63 6f 75 6e 74 69 6e 67 20 66 72 6f 6d 20 7a 65  counting from ze
14400 72 6f 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ro. This functio
14410 6e 20 61 64 64 73 20 70 4c 65 61 66 20 74 6f 20  n adds pLeaf to 
14420 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  the tree..**.** 
14430 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
14440 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
14450 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
14460 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
14470 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
14480 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
14490 64 20 70 4c 65 61 66 20 69 73 20 66 72 65 65 64  d pLeaf is freed
144a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
144b0 76 64 62 65 53 6f 72 74 65 72 41 64 64 54 6f 54  vdbeSorterAddToT
144c0 72 65 65 28 0a 20 20 53 6f 72 74 53 75 62 74 61  ree(.  SortSubta
144d0 73 6b 20 2a 70 54 61 73 6b 2c 20 20 20 20 20 20  sk *pTask,      
144e0 20 20 20 20 20 20 20 2f 2a 20 54 61 73 6b 20 63         /* Task c
144f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
14500 6e 44 65 70 74 68 2c 20 20 20 20 20 20 20 20 20  nDepth,         
14510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
14520 65 70 74 68 20 6f 66 20 74 72 65 65 20 61 63 63  epth of tree acc
14530 6f 72 64 69 6e 67 20 74 6f 20 54 72 65 65 44 65  ording to TreeDe
14540 70 74 68 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69  pth() */.  int i
14550 53 65 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  Seq,            
14560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
14570 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 6f 66  quence number of
14580 20 6c 65 61 66 20 77 69 74 68 69 6e 20 74 72 65   leaf within tre
14590 65 20 2a 2f 0a 20 20 4d 65 72 67 65 45 6e 67 69  e */.  MergeEngi
145a0 6e 65 20 2a 70 52 6f 6f 74 2c 20 20 20 20 20 20  ne *pRoot,      
145b0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 6f         /* Root o
145c0 66 20 74 72 65 65 20 2a 2f 0a 20 20 4d 65 72 67  f tree */.  Merg
145d0 65 45 6e 67 69 6e 65 20 2a 70 4c 65 61 66 20 20  eEngine *pLeaf  
145e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
145f0 65 61 66 20 74 6f 20 61 64 64 20 74 6f 20 74 72  eaf to add to tr
14600 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ee */.){.  int r
14610 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14620 20 69 6e 74 20 6e 44 69 76 20 3d 20 31 3b 0a 20   int nDiv = 1;. 
14630 20 69 6e 74 20 69 3b 0a 20 20 4d 65 72 67 65 45   int i;.  MergeE
14640 6e 67 69 6e 65 20 2a 70 20 3d 20 70 52 6f 6f 74  ngine *p = pRoot
14650 3b 0a 20 20 49 6e 63 72 4d 65 72 67 65 72 20 2a  ;.  IncrMerger *
14660 70 49 6e 63 72 3b 0a 0a 20 20 72 63 20 3d 20 76  pIncr;..  rc = v
14670 64 62 65 49 6e 63 72 4d 65 72 67 65 72 4e 65 77  dbeIncrMergerNew
14680 28 70 54 61 73 6b 2c 20 70 4c 65 61 66 2c 20 26  (pTask, pLeaf, &
14690 70 49 6e 63 72 29 3b 0a 0a 20 20 66 6f 72 28 69  pIncr);..  for(i
146a0 3d 31 3b 20 69 3c 6e 44 65 70 74 68 3b 20 69 2b  =1; i<nDepth; i+
146b0 2b 29 7b 0a 20 20 20 20 6e 44 69 76 20 3d 20 6e  +){.    nDiv = n
146c0 44 69 76 20 2a 20 53 4f 52 54 45 52 5f 4d 41 58  Div * SORTER_MAX
146d0 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  _MERGE_COUNT;.  
146e0 7d 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  }..  for(i=1; i<
146f0 6e 44 65 70 74 68 20 26 26 20 72 63 3d 3d 53 51  nDepth && rc==SQ
14700 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
14710 20 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20 28     int iIter = (
14720 69 53 65 71 20 2f 20 6e 44 69 76 29 20 25 20 53  iSeq / nDiv) % S
14730 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f  ORTER_MAX_MERGE_
14740 43 4f 55 4e 54 3b 0a 20 20 20 20 50 6d 61 52 65  COUNT;.    PmaRe
14750 61 64 65 72 20 2a 70 52 65 61 64 72 20 3d 20 26  ader *pReadr = &
14760 70 2d 3e 61 52 65 61 64 72 5b 69 49 74 65 72 5d  p->aReadr[iIter]
14770 3b 0a 0a 20 20 20 20 69 66 28 20 70 52 65 61 64  ;..    if( pRead
14780 72 2d 3e 70 49 6e 63 72 3d 3d 30 20 29 7b 0a 20  r->pIncr==0 ){. 
14790 20 20 20 20 20 4d 65 72 67 65 45 6e 67 69 6e 65       MergeEngine
147a0 20 2a 70 4e 65 77 20 3d 20 76 64 62 65 4d 65 72   *pNew = vdbeMer
147b0 67 65 45 6e 67 69 6e 65 4e 65 77 28 53 4f 52 54  geEngineNew(SORT
147c0 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55  ER_MAX_MERGE_COU
147d0 4e 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  NT);.      if( p
147e0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
147f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
14800 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
14810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
14820 63 20 3d 20 76 64 62 65 49 6e 63 72 4d 65 72 67  c = vdbeIncrMerg
14830 65 72 4e 65 77 28 70 54 61 73 6b 2c 20 70 4e 65  erNew(pTask, pNe
14840 77 2c 20 26 70 52 65 61 64 72 2d 3e 70 49 6e 63  w, &pReadr->pInc
14850 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
14860 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
14870 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14880 20 70 20 3d 20 70 52 65 61 64 72 2d 3e 70 49 6e   p = pReadr->pIn
14890 63 72 2d 3e 70 4d 65 72 67 65 72 3b 0a 20 20 20  cr->pMerger;.   
148a0 20 20 20 6e 44 69 76 20 3d 20 6e 44 69 76 20 2f     nDiv = nDiv /
148b0 20 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47   SORTER_MAX_MERG
148c0 45 5f 43 4f 55 4e 54 3b 0a 20 20 20 20 7d 0a 20  E_COUNT;.    }. 
148d0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
148e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
148f0 2d 3e 61 52 65 61 64 72 5b 69 53 65 71 20 25 20  ->aReadr[iSeq % 
14900 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45  SORTER_MAX_MERGE
14910 5f 43 4f 55 4e 54 5d 2e 70 49 6e 63 72 20 3d 20  _COUNT].pIncr = 
14920 70 49 6e 63 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pIncr;.  }else{.
14930 20 20 20 20 76 64 62 65 49 6e 63 72 46 72 65 65      vdbeIncrFree
14940 28 70 49 6e 63 72 29 3b 0a 20 20 7d 0a 20 20 72  (pIncr);.  }.  r
14950 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14960 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
14970 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
14980 72 74 20 6f 66 20 61 20 53 6f 72 74 65 72 52 65  rt of a SorterRe
14990 77 69 6e 64 28 29 20 6f 70 65 72 61 74 69 6f 6e  wind() operation
149a0 20 6f 6e 20 61 20 73 6f 72 74 65 72 0a 2a 2a 20   on a sorter.** 
149b0 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
149c0 20 77 72 69 74 74 65 6e 20 74 77 6f 20 6f 72 20   written two or 
149d0 6d 6f 72 65 20 6c 65 76 65 6c 2d 30 20 50 4d 41  more level-0 PMA
149e0 73 20 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  s to one or more
149f0 20 74 65 6d 70 0a 2a 2a 20 66 69 6c 65 73 2e 20   temp.** files. 
14a00 49 74 20 62 75 69 6c 64 73 20 61 20 74 72 65 65  It builds a tree
14a10 20 6f 66 20 4d 65 72 67 65 45 6e 67 69 6e 65 2f   of MergeEngine/
14a20 49 6e 63 72 4d 65 72 67 65 72 2f 50 6d 61 52 65  IncrMerger/PmaRe
14a30 61 64 65 72 20 6f 62 6a 65 63 74 73 20 74 68 61  ader objects tha
14a40 74 20 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  t .** can be use
14a50 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c  d to incremental
14a60 6c 79 20 6d 65 72 67 65 20 61 6c 6c 20 50 4d 41  ly merge all PMA
14a70 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  s on disk..**.**
14a80 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
14a90 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
14aa0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 4f 75 74  urned and *ppOut
14ab0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
14ac0 20 74 68 65 0a 2a 2a 20 4d 65 72 67 65 45 6e 67   the.** MergeEng
14ad0 69 6e 65 20 6f 62 6a 65 63 74 20 61 74 20 74 68  ine object at th
14ae0 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  e root of the tr
14af0 65 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ee before return
14b00 69 6e 67 2e 20 4f 72 2c 20 69 66 20 61 6e 0a 2a  ing. Or, if an.*
14b10 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  * error occurs, 
14b20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
14b30 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
14b40 20 61 6e 64 20 74 68 65 20 66 69 6e 61 6c 20 76   and the final v
14b50 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 2a 70 70 4f  alue .** of *ppO
14b60 75 74 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ut is undefined.
14b70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
14b80 64 62 65 53 6f 72 74 65 72 4d 65 72 67 65 54 72  dbeSorterMergeTr
14b90 65 65 42 75 69 6c 64 28 0a 20 20 56 64 62 65 53  eeBuild(.  VdbeS
14ba0 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72 2c 20  orter *pSorter, 
14bb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
14bc0 45 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 6d  E cursor that im
14bd0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 6f 72  plements the sor
14be0 74 20 2a 2f 0a 20 20 4d 65 72 67 65 45 6e 67 69  t */.  MergeEngi
14bf0 6e 65 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20  ne **ppOut      
14c00 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 4d    /* Write the M
14c10 65 72 67 65 45 6e 67 69 6e 65 20 68 65 72 65 20  ergeEngine here 
14c20 2a 2f 0a 29 7b 0a 20 20 4d 65 72 67 65 45 6e 67  */.){.  MergeEng
14c30 69 6e 65 20 2a 70 4d 61 69 6e 20 3d 20 30 3b 0a  ine *pMain = 0;.
14c40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14c50 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 54 61 73  E_OK;.  int iTas
14c60 6b 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  k;..#if SQLITE_M
14c70 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
14c80 53 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  S>0.  /* If the 
14c90 73 6f 72 74 65 72 20 75 73 65 73 20 6d 6f 72 65  sorter uses more
14ca0 20 74 68 61 6e 20 6f 6e 65 20 74 61 73 6b 2c 20   than one task, 
14cb0 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20  then create the 
14cc0 74 6f 70 2d 6c 65 76 65 6c 20 0a 20 20 2a 2a 20  top-level .  ** 
14cd0 4d 65 72 67 65 45 6e 67 69 6e 65 20 68 65 72 65  MergeEngine here
14ce0 2e 20 54 68 69 73 20 4d 65 72 67 65 45 6e 67 69  . This MergeEngi
14cf0 6e 65 20 77 69 6c 6c 20 72 65 61 64 20 64 61 74  ne will read dat
14d00 61 20 66 72 6f 6d 20 65 78 61 63 74 6c 79 20 0a  a from exactly .
14d10 20 20 2a 2a 20 6f 6e 65 20 50 6d 61 52 65 61 64    ** one PmaRead
14d20 65 72 20 70 65 72 20 73 75 62 2d 74 61 73 6b 2e  er per sub-task.
14d30 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
14d40 53 6f 72 74 65 72 2d 3e 62 55 73 65 54 68 72 65  Sorter->bUseThre
14d50 61 64 73 20 7c 7c 20 70 53 6f 72 74 65 72 2d 3e  ads || pSorter->
14d60 6e 54 61 73 6b 3d 3d 31 20 29 3b 0a 20 20 69 66  nTask==1 );.  if
14d70 28 20 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73 6b  ( pSorter->nTask
14d80 3e 31 20 29 7b 0a 20 20 20 20 70 4d 61 69 6e 20  >1 ){.    pMain 
14d90 3d 20 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e  = vdbeMergeEngin
14da0 65 4e 65 77 28 70 53 6f 72 74 65 72 2d 3e 6e 54  eNew(pSorter->nT
14db0 61 73 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  ask);.    if( pM
14dc0 61 69 6e 3d 3d 30 20 29 20 72 63 20 3d 20 53 51  ain==0 ) rc = SQ
14dd0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
14de0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 66  .  }.#endif..  f
14df0 6f 72 28 69 54 61 73 6b 3d 30 3b 20 72 63 3d 3d  or(iTask=0; rc==
14e00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 54 61  SQLITE_OK && iTa
14e10 73 6b 3c 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73  sk<pSorter->nTas
14e20 6b 3b 20 69 54 61 73 6b 2b 2b 29 7b 0a 20 20 20  k; iTask++){.   
14e30 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54   SortSubtask *pT
14e40 61 73 6b 20 3d 20 26 70 53 6f 72 74 65 72 2d 3e  ask = &pSorter->
14e50 61 54 61 73 6b 5b 69 54 61 73 6b 5d 3b 0a 20 20  aTask[iTask];.  
14e60 20 20 61 73 73 65 72 74 28 20 70 54 61 73 6b 2d    assert( pTask-
14e70 3e 6e 50 4d 41 3e 30 20 7c 7c 20 53 51 4c 49 54  >nPMA>0 || SQLIT
14e80 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
14e90 45 41 44 53 3e 30 20 29 3b 0a 20 20 20 20 69 66  EADS>0 );.    if
14ea0 28 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  ( SQLITE_MAX_WOR
14eb0 4b 45 52 5f 54 48 52 45 41 44 53 3d 3d 30 20 7c  KER_THREADS==0 |
14ec0 7c 20 70 54 61 73 6b 2d 3e 6e 50 4d 41 20 29 7b  | pTask->nPMA ){
14ed0 0a 20 20 20 20 20 20 4d 65 72 67 65 45 6e 67 69  .      MergeEngi
14ee0 6e 65 20 2a 70 52 6f 6f 74 20 3d 20 30 3b 20 20  ne *pRoot = 0;  
14ef0 20 20 20 2f 2a 20 52 6f 6f 74 20 6e 6f 64 65 20     /* Root node 
14f00 6f 66 20 74 72 65 65 20 66 6f 72 20 74 68 69 73  of tree for this
14f10 20 74 61 73 6b 20 2a 2f 0a 20 20 20 20 20 20 69   task */.      i
14f20 6e 74 20 6e 44 65 70 74 68 20 3d 20 76 64 62 65  nt nDepth = vdbe
14f30 53 6f 72 74 65 72 54 72 65 65 44 65 70 74 68 28  SorterTreeDepth(
14f40 70 54 61 73 6b 2d 3e 6e 50 4d 41 29 3b 0a 20 20  pTask->nPMA);.  
14f50 20 20 20 20 69 36 34 20 69 52 65 61 64 4f 66 66      i64 iReadOff
14f60 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28   = 0;..      if(
14f70 20 70 54 61 73 6b 2d 3e 6e 50 4d 41 3c 3d 53 4f   pTask->nPMA<=SO
14f80 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43  RTER_MAX_MERGE_C
14f90 4f 55 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  OUNT ){.        
14fa0 72 63 20 3d 20 76 64 62 65 4d 65 72 67 65 45 6e  rc = vdbeMergeEn
14fb0 67 69 6e 65 4c 65 76 65 6c 30 28 70 54 61 73 6b  gineLevel0(pTask
14fc0 2c 20 70 54 61 73 6b 2d 3e 6e 50 4d 41 2c 20 26  , pTask->nPMA, &
14fd0 69 52 65 61 64 4f 66 66 2c 20 26 70 52 6f 6f 74  iReadOff, &pRoot
14fe0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
14ff0 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
15000 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 71 20         int iSeq 
15010 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 52 6f  = 0;.        pRo
15020 6f 74 20 3d 20 76 64 62 65 4d 65 72 67 65 45 6e  ot = vdbeMergeEn
15030 67 69 6e 65 4e 65 77 28 53 4f 52 54 45 52 5f 4d  gineNew(SORTER_M
15040 41 58 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 29 3b  AX_MERGE_COUNT);
15050 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52 6f  .        if( pRo
15060 6f 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c  ot==0 ) rc = SQL
15070 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
15080 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
15090 20 69 3c 70 54 61 73 6b 2d 3e 6e 50 4d 41 20 26   i<pTask->nPMA &
150a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
150b0 20 69 20 2b 3d 20 53 4f 52 54 45 52 5f 4d 41 58   i += SORTER_MAX
150c0 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 29 7b 0a 20  _MERGE_COUNT){. 
150d0 20 20 20 20 20 20 20 20 20 4d 65 72 67 65 45 6e           MergeEn
150e0 67 69 6e 65 20 2a 70 4d 65 72 67 65 72 20 3d 20  gine *pMerger = 
150f0 30 3b 20 2f 2a 20 4e 65 77 20 6c 65 76 65 6c 2d  0; /* New level-
15100 30 20 50 4d 41 20 6d 65 72 67 65 72 20 2a 2f 0a  0 PMA merger */.
15110 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52            int nR
15120 65 61 64 65 72 3b 20 20 20 20 20 20 20 20 20 20  eader;          
15130 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15140 20 6c 65 76 65 6c 2d 30 20 50 4d 41 73 20 74 6f   level-0 PMAs to
15150 20 6d 65 72 67 65 20 2a 2f 0a 0a 20 20 20 20 20   merge */..     
15160 20 20 20 20 20 6e 52 65 61 64 65 72 20 3d 20 4d       nReader = M
15170 49 4e 28 70 54 61 73 6b 2d 3e 6e 50 4d 41 20 2d  IN(pTask->nPMA -
15180 20 69 2c 20 53 4f 52 54 45 52 5f 4d 41 58 5f 4d   i, SORTER_MAX_M
15190 45 52 47 45 5f 43 4f 55 4e 54 29 3b 0a 20 20 20  ERGE_COUNT);.   
151a0 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
151b0 4d 65 72 67 65 45 6e 67 69 6e 65 4c 65 76 65 6c  MergeEngineLevel
151c0 30 28 70 54 61 73 6b 2c 20 6e 52 65 61 64 65 72  0(pTask, nReader
151d0 2c 20 26 69 52 65 61 64 4f 66 66 2c 20 26 70 4d  , &iReadOff, &pM
151e0 65 72 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  erger);.        
151f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15200 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
15210 20 20 20 72 63 20 3d 20 76 64 62 65 53 6f 72 74     rc = vdbeSort
15220 65 72 41 64 64 54 6f 54 72 65 65 28 70 54 61 73  erAddToTree(pTas
15230 6b 2c 20 6e 44 65 70 74 68 2c 20 69 53 65 71 2b  k, nDepth, iSeq+
15240 2b 2c 20 70 52 6f 6f 74 2c 20 70 4d 65 72 67 65  +, pRoot, pMerge
15250 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
15260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15270 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  }..      if( rc=
15280 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
15290 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  f SQLITE_MAX_WOR
152a0 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 0a 20 20  KER_THREADS>0.  
152b0 20 20 20 20 20 20 69 66 28 20 70 4d 61 69 6e 21        if( pMain!
152c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
152d0 72 63 20 3d 20 76 64 62 65 49 6e 63 72 4d 65 72  rc = vdbeIncrMer
152e0 67 65 72 4e 65 77 28 70 54 61 73 6b 2c 20 70 52  gerNew(pTask, pR
152f0 6f 6f 74 2c 20 26 70 4d 61 69 6e 2d 3e 61 52 65  oot, &pMain->aRe
15300 61 64 72 5b 69 54 61 73 6b 5d 2e 70 49 6e 63 72  adr[iTask].pIncr
15310 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
15320 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
15330 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
15340 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 29 3b 0a  rt( pMain==0 );.
15350 20 20 20 20 20 20 20 20 20 20 70 4d 61 69 6e 20            pMain 
15360 3d 20 70 52 6f 6f 74 3b 0a 20 20 20 20 20 20 20  = pRoot;.       
15370 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
15380 20 20 20 20 20 20 20 20 76 64 62 65 4d 65 72 67          vdbeMerg
15390 65 45 6e 67 69 6e 65 46 72 65 65 28 70 52 6f 6f  eEngineFree(pRoo
153a0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
153b0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
153c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
153d0 20 20 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e    vdbeMergeEngin
153e0 65 46 72 65 65 28 70 4d 61 69 6e 29 3b 0a 20 20  eFree(pMain);.  
153f0 20 20 70 4d 61 69 6e 20 3d 20 30 3b 0a 20 20 7d    pMain = 0;.  }
15400 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 4d 61 69  .  *ppOut = pMai
15410 6e 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  n;.  return rc;.
15420 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
15430 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
15440 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 73   as part of an s
15450 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
15460 52 65 77 69 6e 64 28 29 20 6f 70 65 72 61 74 69  Rewind() operati
15470 6f 6e 0a 2a 2a 20 6f 6e 20 61 20 73 6f 72 74 65  on.** on a sorte
15480 72 20 74 68 61 74 20 68 61 73 20 77 72 69 74 74  r that has writt
15490 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 50  en two or more P
154a0 4d 41 73 20 74 6f 20 74 65 6d 70 6f 72 61 72 79  MAs to temporary
154b0 20 66 69 6c 65 73 2e 20 49 74 20 73 65 74 73 0a   files. It sets.
154c0 2a 2a 20 75 70 20 65 69 74 68 65 72 20 56 64 62  ** up either Vdb
154d0 65 53 6f 72 74 65 72 2e 70 4d 65 72 67 65 72 20  eSorter.pMerger 
154e0 28 66 6f 72 20 73 69 6e 67 6c 65 20 74 68 72 65  (for single thre
154f0 61 64 65 64 20 73 6f 72 74 65 72 73 29 20 6f 72  aded sorters) or
15500 20 70 52 65 61 64 65 72 0a 2a 2a 20 28 66 6f 72   pReader.** (for
15510 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20   multi-threaded 
15520 73 6f 72 74 65 72 73 29 20 73 6f 20 74 68 61 74  sorters) so that
15530 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 20   it can be used 
15540 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
15550 67 68 0a 2a 2a 20 61 6c 6c 20 72 65 63 6f 72 64  gh.** all record
15560 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
15570 73 6f 72 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51  sorter..**.** SQ
15580 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
15590 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ned if successfu
155a0 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
155b0 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
155c0 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
155d0 69 6e 74 20 76 64 62 65 53 6f 72 74 65 72 53 65  int vdbeSorterSe
155e0 74 75 70 4d 65 72 67 65 28 56 64 62 65 53 6f 72  tupMerge(VdbeSor
155f0 74 65 72 20 2a 70 53 6f 72 74 65 72 29 7b 0a 20  ter *pSorter){. 
15600 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15620 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
15630 2a 2f 0a 20 20 53 6f 72 74 53 75 62 74 61 73 6b  */.  SortSubtask
15640 20 2a 70 54 61 73 6b 30 20 3d 20 26 70 53 6f 72   *pTask0 = &pSor
15650 74 65 72 2d 3e 61 54 61 73 6b 5b 30 5d 3b 0a 20  ter->aTask[0];. 
15660 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 2a 70 4d   MergeEngine *pM
15670 61 69 6e 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c  ain = 0;.#if SQL
15680 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
15690 48 52 45 41 44 53 0a 20 20 73 71 6c 69 74 65 33  HREADS.  sqlite3
156a0 20 2a 64 62 20 3d 20 70 54 61 73 6b 30 2d 3e 70   *db = pTask0->p
156b0 53 6f 72 74 65 72 2d 3e 64 62 3b 0a 20 20 69 6e  Sorter->db;.  in
156c0 74 20 69 3b 0a 20 20 53 6f 72 74 65 72 43 6f 6d  t i;.  SorterCom
156d0 70 61 72 65 20 78 43 6f 6d 70 61 72 65 20 3d 20  pare xCompare = 
156e0 76 64 62 65 53 6f 72 74 65 72 47 65 74 43 6f 6d  vdbeSorterGetCom
156f0 70 61 72 65 28 70 53 6f 72 74 65 72 29 3b 0a 20  pare(pSorter);. 
15700 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f 72   for(i=0; i<pSor
15710 74 65 72 2d 3e 6e 54 61 73 6b 3b 20 69 2b 2b 29  ter->nTask; i++)
15720 7b 0a 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 61  {.    pSorter->a
15730 54 61 73 6b 5b 69 5d 2e 78 43 6f 6d 70 61 72 65  Task[i].xCompare
15740 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 7d   = xCompare;.  }
15750 0a 23 65 6e 64 69 66 0a 0a 20 20 72 63 20 3d 20  .#endif..  rc = 
15760 76 64 62 65 53 6f 72 74 65 72 4d 65 72 67 65 54  vdbeSorterMergeT
15770 72 65 65 42 75 69 6c 64 28 70 53 6f 72 74 65 72  reeBuild(pSorter
15780 2c 20 26 70 4d 61 69 6e 29 3b 0a 20 20 69 66 28  , &pMain);.  if(
15790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
157a0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
157b0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 0a  _WORKER_THREADS.
157c0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72      assert( pSor
157d0 74 65 72 2d 3e 62 55 73 65 54 68 72 65 61 64 73  ter->bUseThreads
157e0 3d 3d 30 20 7c 7c 20 70 53 6f 72 74 65 72 2d 3e  ==0 || pSorter->
157f0 6e 54 61 73 6b 3e 31 20 29 3b 0a 20 20 20 20 69  nTask>1 );.    i
15800 66 28 20 70 53 6f 72 74 65 72 2d 3e 62 55 73 65  f( pSorter->bUse
15810 54 68 72 65 61 64 73 20 29 7b 0a 20 20 20 20 20  Threads ){.     
15820 20 69 6e 74 20 69 54 61 73 6b 3b 0a 20 20 20 20   int iTask;.    
15830 20 20 50 6d 61 52 65 61 64 65 72 20 2a 70 52 65    PmaReader *pRe
15840 61 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 53  adr = 0;.      S
15850 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 4c 61 73  ortSubtask *pLas
15860 74 20 3d 20 26 70 53 6f 72 74 65 72 2d 3e 61 54  t = &pSorter->aT
15870 61 73 6b 5b 70 53 6f 72 74 65 72 2d 3e 6e 54 61  ask[pSorter->nTa
15880 73 6b 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63 20  sk-1];.      rc 
15890 3d 20 76 64 62 65 53 6f 72 74 41 6c 6c 6f 63 55  = vdbeSortAllocU
158a0 6e 70 61 63 6b 65 64 28 70 4c 61 73 74 29 3b 0a  npacked(pLast);.
158b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
158c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
158d0 20 20 20 70 52 65 61 64 72 20 3d 20 28 50 6d 61     pReadr = (Pma
158e0 52 65 61 64 65 72 2a 29 73 71 6c 69 74 65 33 44  Reader*)sqlite3D
158f0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
15900 73 69 7a 65 6f 66 28 50 6d 61 52 65 61 64 65 72  sizeof(PmaReader
15910 29 29 3b 0a 20 20 20 20 20 20 20 20 70 53 6f 72  ));.        pSor
15920 74 65 72 2d 3e 70 52 65 61 64 65 72 20 3d 20 70  ter->pReader = p
15930 52 65 61 64 72 3b 0a 20 20 20 20 20 20 20 20 69  Readr;.        i
15940 66 28 20 70 52 65 61 64 72 3d 3d 30 20 29 20 72  f( pReadr==0 ) r
15950 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
15960 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
15970 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
15980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15990 20 20 72 63 20 3d 20 76 64 62 65 49 6e 63 72 4d    rc = vdbeIncrM
159a0 65 72 67 65 72 4e 65 77 28 70 4c 61 73 74 2c 20  ergerNew(pLast, 
159b0 70 4d 61 69 6e 2c 20 26 70 52 65 61 64 72 2d 3e  pMain, &pReadr->
159c0 70 49 6e 63 72 29 3b 0a 20 20 20 20 20 20 20 20  pIncr);.        
159d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
159e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76  K ){.          v
159f0 64 62 65 49 6e 63 72 4d 65 72 67 65 72 53 65 74  dbeIncrMergerSet
15a00 54 68 72 65 61 64 73 28 70 52 65 61 64 72 2d 3e  Threads(pReadr->
15a10 70 49 6e 63 72 29 3b 0a 20 20 20 20 20 20 20 20  pIncr);.        
15a20 20 20 66 6f 72 28 69 54 61 73 6b 3d 30 3b 20 69    for(iTask=0; i
15a30 54 61 73 6b 3c 28 70 53 6f 72 74 65 72 2d 3e 6e  Task<(pSorter->n
15a40 54 61 73 6b 2d 31 29 3b 20 69 54 61 73 6b 2b 2b  Task-1); iTask++
15a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  ){.            I
15a60 6e 63 72 4d 65 72 67 65 72 20 2a 70 49 6e 63 72  ncrMerger *pIncr
15a70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
15a80 28 20 28 70 49 6e 63 72 20 3d 20 70 4d 61 69 6e  ( (pIncr = pMain
15a90 2d 3e 61 52 65 61 64 72 5b 69 54 61 73 6b 5d 2e  ->aReadr[iTask].
15aa0 70 49 6e 63 72 29 20 29 7b 0a 20 20 20 20 20 20  pIncr) ){.      
15ab0 20 20 20 20 20 20 20 20 76 64 62 65 49 6e 63 72          vdbeIncr
15ac0 4d 65 72 67 65 72 53 65 74 54 68 72 65 61 64 73  MergerSetThreads
15ad0 28 70 49 6e 63 72 29 3b 0a 20 20 20 20 20 20 20  (pIncr);.       
15ae0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15af0 49 6e 63 72 2d 3e 70 54 61 73 6b 21 3d 70 4c 61  Incr->pTask!=pLa
15b00 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  st );.          
15b10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
15b20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 54            for(iT
15b30 61 73 6b 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  ask=0; rc==SQLIT
15b40 45 5f 4f 4b 20 26 26 20 69 54 61 73 6b 3c 70 53  E_OK && iTask<pS
15b50 6f 72 74 65 72 2d 3e 6e 54 61 73 6b 3b 20 69 54  orter->nTask; iT
15b60 61 73 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ask++){.        
15b70 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
15b80 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t:.            *
15b90 2a 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  *   .           
15ba0 20 2a 2a 20 20 20 61 29 20 54 68 65 20 69 6e 63   **   a) The inc
15bb0 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f  remental merge o
15bc0 62 6a 65 63 74 20 69 73 20 63 6f 6e 66 69 67 75  bject is configu
15bd0 72 65 64 20 74 6f 20 75 73 65 20 74 68 65 0a 20  red to use the. 
15be0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20             **   
15bf0 20 20 20 72 69 67 68 74 20 74 61 73 6b 2c 20 61     right task, a
15c00 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  nd.            *
15c10 2a 20 20 20 62 29 20 49 66 20 69 74 20 69 73 20  *   b) If it is 
15c20 75 73 69 6e 67 20 74 61 73 6b 20 28 6e 54 61 73  using task (nTas
15c30 6b 2d 31 29 2c 20 69 74 20 69 73 20 63 6f 6e 66  k-1), it is conf
15c40 69 67 75 72 65 64 20 74 6f 20 72 75 6e 0a 20 20  igured to run.  
15c50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20            **    
15c60 20 20 69 6e 20 73 69 6e 67 6c 65 2d 74 68 72 65    in single-thre
15c70 61 64 65 64 20 6d 6f 64 65 2e 20 54 68 69 73 20  aded mode. This 
15c80 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 20 61 73  is important, as
15c90 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
15ca0 20 2a 2a 20 20 20 20 20 20 72 6f 6f 74 20 6d 65   **      root me
15cb0 72 67 65 20 28 49 4e 43 52 49 4e 49 54 5f 52 4f  rge (INCRINIT_RO
15cc0 4f 54 29 20 77 69 6c 6c 20 62 65 20 75 73 69 6e  OT) will be usin
15cd0 67 20 74 68 65 20 73 61 6d 65 20 74 61 73 6b 0a  g the same task.
15ce0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20              **  
15cf0 20 20 20 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20      object..    
15d00 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
15d10 20 20 20 20 20 20 20 50 6d 61 52 65 61 64 65 72         PmaReader
15d20 20 2a 70 20 3d 20 26 70 4d 61 69 6e 2d 3e 61 52   *p = &pMain->aR
15d30 65 61 64 72 5b 69 54 61 73 6b 5d 3b 0a 20 20 20  eadr[iTask];.   
15d40 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
15d50 20 70 2d 3e 70 49 6e 63 72 3d 3d 30 20 7c 7c 20   p->pIncr==0 || 
15d60 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
15d70 20 20 28 70 2d 3e 70 49 6e 63 72 2d 3e 70 54 61    (p->pIncr->pTa
15d80 73 6b 3d 3d 26 70 53 6f 72 74 65 72 2d 3e 61 54  sk==&pSorter->aT
15d90 61 73 6b 5b 69 54 61 73 6b 5d 29 20 20 20 20 20  ask[iTask])     
15da0 20 20 20 20 20 20 20 20 2f 2a 20 61 20 2a 2f 0a          /* a */.
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
15dc0 28 69 54 61 73 6b 21 3d 70 53 6f 72 74 65 72 2d  (iTask!=pSorter-
15dd0 3e 6e 54 61 73 6b 2d 31 20 7c 7c 20 70 2d 3e 70  >nTask-1 || p->p
15de0 49 6e 63 72 2d 3e 62 55 73 65 54 68 72 65 61 64  Incr->bUseThread
15df0 3d 3d 30 29 20 20 2f 2a 20 62 20 2a 2f 0a 20 20  ==0)  /* b */.  
15e00 20 20 20 20 20 20 20 20 20 20 29 29 3b 0a 20 20            ));.  
15e10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76            rc = v
15e20 64 62 65 50 6d 61 52 65 61 64 65 72 49 6e 63 72  dbePmaReaderIncr
15e30 49 6e 69 74 28 70 2c 20 49 4e 43 52 49 4e 49 54  Init(p, INCRINIT
15e40 5f 54 41 53 4b 29 3b 0a 20 20 20 20 20 20 20 20  _TASK);.        
15e50 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
15e60 20 20 20 20 20 20 70 4d 61 69 6e 20 3d 20 30 3b        pMain = 0;
15e70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15e80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15e90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
15ea0 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 49 6e   vdbePmaReaderIn
15eb0 63 72 4d 65 72 67 65 49 6e 69 74 28 70 52 65 61  crMergeInit(pRea
15ec0 64 72 2c 20 49 4e 43 52 49 4e 49 54 5f 52 4f 4f  dr, INCRINIT_ROO
15ed0 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
15ee0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
15ef0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 76 64   {.      rc = vd
15f00 62 65 4d 65 72 67 65 45 6e 67 69 6e 65 49 6e 69  beMergeEngineIni
15f10 74 28 70 54 61 73 6b 30 2c 20 70 4d 61 69 6e 2c  t(pTask0, pMain,
15f20 20 49 4e 43 52 49 4e 49 54 5f 4e 4f 52 4d 41 4c   INCRINIT_NORMAL
15f30 29 3b 0a 20 20 20 20 20 20 70 53 6f 72 74 65 72  );.      pSorter
15f40 2d 3e 70 4d 65 72 67 65 72 20 3d 20 70 4d 61 69  ->pMerger = pMai
15f50 6e 3b 0a 20 20 20 20 20 20 70 4d 61 69 6e 20 3d  n;.      pMain =
15f60 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
15f70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15f80 4f 4b 20 29 7b 0a 20 20 20 20 76 64 62 65 4d 65  OK ){.    vdbeMe
15f90 72 67 65 45 6e 67 69 6e 65 46 72 65 65 28 70 4d  rgeEngineFree(pM
15fa0 61 69 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ain);.  }.  retu
15fb0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
15fc0 20 4f 6e 63 65 20 74 68 65 20 73 6f 72 74 65 72   Once the sorter
15fd0 20 68 61 73 20 62 65 65 6e 20 70 6f 70 75 6c 61   has been popula
15fe0 74 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  ted by calls to 
15ff0 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
16000 72 57 72 69 74 65 2c 0a 2a 2a 20 74 68 69 73 20  rWrite,.** this 
16010 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
16020 65 64 20 74 6f 20 70 72 65 70 61 72 65 20 66 6f  ed to prepare fo
16030 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
16040 75 67 68 20 74 68 65 20 72 65 63 6f 72 64 73 0a  ugh the records.
16050 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ** in sorted ord
16060 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
16070 65 33 56 64 62 65 53 6f 72 74 65 72 52 65 77 69  e3VdbeSorterRewi
16080 6e 64 28 63 6f 6e 73 74 20 56 64 62 65 43 75 72  nd(const VdbeCur
16090 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 2a  sor *pCsr, int *
160a0 70 62 45 6f 66 29 7b 0a 20 20 56 64 62 65 53 6f  pbEof){.  VdbeSo
160b0 72 74 65 72 20 2a 70 53 6f 72 74 65 72 3b 0a 20  rter *pSorter;. 
160c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
160d0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
160e0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
160f0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  */..  assert( pC
16100 73 72 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  sr->eCurType==CU
16110 52 54 59 50 45 5f 53 4f 52 54 45 52 20 29 3b 0a  RTYPE_SORTER );.
16120 20 20 70 53 6f 72 74 65 72 20 3d 20 70 43 73 72    pSorter = pCsr
16130 2d 3e 75 63 2e 70 53 6f 72 74 65 72 3b 0a 20 20  ->uc.pSorter;.  
16140 61 73 73 65 72 74 28 20 70 53 6f 72 74 65 72 20  assert( pSorter 
16150 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 64  );..  /* If no d
16160 61 74 61 20 68 61 73 20 62 65 65 6e 20 77 72 69  ata has been wri
16170 74 74 65 6e 20 74 6f 20 64 69 73 6b 2c 20 74 68  tten to disk, th
16180 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 73 6f 20  en do not do so 
16190 6e 6f 77 2e 20 49 6e 73 74 65 61 64 2c 0a 20 20  now. Instead,.  
161a0 2a 2a 20 73 6f 72 74 20 74 68 65 20 56 64 62 65  ** sort the Vdbe
161b0 53 6f 72 74 65 72 2e 70 52 65 63 6f 72 64 20 6c  Sorter.pRecord l
161c0 69 73 74 2e 20 54 68 65 20 76 64 62 65 20 6c 61  ist. The vdbe la
161d0 79 65 72 20 77 69 6c 6c 20 72 65 61 64 20 64 61  yer will read da
161e0 74 61 20 64 69 72 65 63 74 6c 79 0a 20 20 2a 2a  ta directly.  **
161f0 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d   from the in-mem
16200 6f 72 79 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  ory list.  */.  
16210 69 66 28 20 70 53 6f 72 74 65 72 2d 3e 62 55 73  if( pSorter->bUs
16220 65 50 4d 41 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ePMA==0 ){.    i
16230 66 28 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74  f( pSorter->list
16240 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  .pList ){.      
16250 2a 70 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20  *pbEof = 0;.    
16260 20 20 72 63 20 3d 20 76 64 62 65 53 6f 72 74 65    rc = vdbeSorte
16270 72 53 6f 72 74 28 26 70 53 6f 72 74 65 72 2d 3e  rSort(&pSorter->
16280 61 54 61 73 6b 5b 30 5d 2c 20 26 70 53 6f 72 74  aTask[0], &pSort
16290 65 72 2d 3e 6c 69 73 74 29 3b 0a 20 20 20 20 7d  er->list);.    }
162a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 62 45  else{.      *pbE
162b0 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  of = 1;.    }.  
162c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
162d0 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
162e0 20 63 75 72 72 65 6e 74 20 69 6e 2d 6d 65 6d 6f   current in-memo
162f0 72 79 20 6c 69 73 74 20 74 6f 20 61 20 50 4d 41  ry list to a PMA
16300 2e 20 57 68 65 6e 20 74 68 65 20 56 64 62 65 53  . When the VdbeS
16310 6f 72 74 65 72 57 72 69 74 65 28 29 20 0a 20 20  orterWrite() .  
16320 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 6c 75 73  ** function flus
16330 68 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hes the contents
16340 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 64 69   of memory to di
16350 73 6b 2c 20 69 74 20 69 6d 6d 65 64 69 61 74 65  sk, it immediate
16360 6c 79 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 63  ly always.  ** c
16370 72 65 61 74 65 73 20 61 20 6e 65 77 20 6c 69 73  reates a new lis
16380 74 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  t consisting of 
16390 61 20 73 69 6e 67 6c 65 20 6b 65 79 20 69 6d 6d  a single key imm
163a0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 77 61  ediately afterwa
163b0 72 64 73 2e 0a 20 20 2a 2a 20 53 6f 20 74 68 65  rds..  ** So the
163c0 20 6c 69 73 74 20 69 73 20 6e 65 76 65 72 20 65   list is never e
163d0 6d 70 74 79 20 61 74 20 74 68 69 73 20 70 6f 69  mpty at this poi
163e0 6e 74 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  nt.  */.  assert
163f0 28 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e  ( pSorter->list.
16400 70 4c 69 73 74 20 29 3b 0a 20 20 72 63 20 3d 20  pList );.  rc = 
16410 76 64 62 65 53 6f 72 74 65 72 46 6c 75 73 68 50  vdbeSorterFlushP
16420 4d 41 28 70 53 6f 72 74 65 72 29 3b 0a 0a 20 20  MA(pSorter);..  
16430 2f 2a 20 4a 6f 69 6e 20 61 6c 6c 20 74 68 72 65  /* Join all thre
16440 61 64 73 20 2a 2f 0a 20 20 72 63 20 3d 20 76 64  ads */.  rc = vd
16450 62 65 53 6f 72 74 65 72 4a 6f 69 6e 41 6c 6c 28  beSorterJoinAll(
16460 70 53 6f 72 74 65 72 2c 20 72 63 29 3b 0a 0a 20  pSorter, rc);.. 
16470 20 76 64 62 65 53 6f 72 74 65 72 52 65 77 69 6e   vdbeSorterRewin
16480 64 44 65 62 75 67 28 22 72 65 77 69 6e 64 22 29  dDebug("rewind")
16490 3b 0a 0a 20 20 2f 2a 20 41 73 73 75 6d 69 6e 67  ;..  /* Assuming
164a0 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 20   no errors have 
164b0 6f 63 63 75 72 72 65 64 2c 20 73 65 74 20 75 70  occurred, set up
164c0 20 61 20 6d 65 72 67 65 72 20 73 74 72 75 63 74   a merger struct
164d0 75 72 65 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 63  ure to .  ** inc
164e0 72 65 6d 65 6e 74 61 6c 6c 79 20 72 65 61 64 20  rementally read 
164f0 61 6e 64 20 6d 65 72 67 65 20 61 6c 6c 20 72 65  and merge all re
16500 6d 61 69 6e 69 6e 67 20 50 4d 41 73 2e 20 20 2a  maining PMAs.  *
16510 2f 0a 20 20 61 73 73 65 72 74 28 20 70 53 6f 72  /.  assert( pSor
16520 74 65 72 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20  ter->pReader==0 
16530 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
16540 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
16550 20 3d 20 76 64 62 65 53 6f 72 74 65 72 53 65 74   = vdbeSorterSet
16560 75 70 4d 65 72 67 65 28 70 53 6f 72 74 65 72 29  upMerge(pSorter)
16570 3b 0a 20 20 20 20 2a 70 62 45 6f 66 20 3d 20 30  ;.    *pbEof = 0
16580 3b 0a 20 20 7d 0a 0a 20 20 76 64 62 65 53 6f 72  ;.  }..  vdbeSor
16590 74 65 72 52 65 77 69 6e 64 44 65 62 75 67 28 22  terRewindDebug("
165a0 72 65 77 69 6e 64 64 6f 6e 65 22 29 3b 0a 20 20  rewinddone");.  
165b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
165c0 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74  .** Advance to t
165d0 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
165e0 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  in the sorter..*
165f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
16600 65 53 6f 72 74 65 72 4e 65 78 74 28 73 71 6c 69  eSorterNext(sqli
16610 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 56  te3 *db, const V
16620 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  dbeCursor *pCsr,
16630 20 69 6e 74 20 2a 70 62 45 6f 66 29 7b 0a 20 20   int *pbEof){.  
16640 56 64 62 65 53 6f 72 74 65 72 20 2a 70 53 6f 72  VdbeSorter *pSor
16650 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  ter;.  int rc;  
16660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16670 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
16680 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   code */..  asse
16690 72 74 28 20 70 43 73 72 2d 3e 65 43 75 72 54 79  rt( pCsr->eCurTy
166a0 70 65 3d 3d 43 55 52 54 59 50 45 5f 53 4f 52 54  pe==CURTYPE_SORT
166b0 45 52 20 29 3b 0a 20 20 70 53 6f 72 74 65 72 20  ER );.  pSorter 
166c0 3d 20 70 43 73 72 2d 3e 75 63 2e 70 53 6f 72 74  = pCsr->uc.pSort
166d0 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  er;.  assert( pS
166e0 6f 72 74 65 72 2d 3e 62 55 73 65 50 4d 41 20 7c  orter->bUsePMA |
166f0 7c 20 28 70 53 6f 72 74 65 72 2d 3e 70 52 65 61  | (pSorter->pRea
16700 64 65 72 3d 3d 30 20 26 26 20 70 53 6f 72 74 65  der==0 && pSorte
16710 72 2d 3e 70 4d 65 72 67 65 72 3d 3d 30 29 20 29  r->pMerger==0) )
16720 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 65 72 2d  ;.  if( pSorter-
16730 3e 62 55 73 65 50 4d 41 20 29 7b 0a 20 20 20 20  >bUsePMA ){.    
16740 61 73 73 65 72 74 28 20 70 53 6f 72 74 65 72 2d  assert( pSorter-
16750 3e 70 52 65 61 64 65 72 3d 3d 30 20 7c 7c 20 70  >pReader==0 || p
16760 53 6f 72 74 65 72 2d 3e 70 4d 65 72 67 65 72 3d  Sorter->pMerger=
16770 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
16780 28 20 70 53 6f 72 74 65 72 2d 3e 62 55 73 65 54  ( pSorter->bUseT
16790 68 72 65 61 64 73 3d 3d 30 20 7c 7c 20 70 53 6f  hreads==0 || pSo
167a0 72 74 65 72 2d 3e 70 52 65 61 64 65 72 20 29 3b  rter->pReader );
167b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 6f  .    assert( pSo
167c0 72 74 65 72 2d 3e 62 55 73 65 54 68 72 65 61 64  rter->bUseThread
167d0 73 3d 3d 31 20 7c 7c 20 70 53 6f 72 74 65 72 2d  s==1 || pSorter-
167e0 3e 70 4d 65 72 67 65 72 20 29 3b 0a 23 69 66 20  >pMerger );.#if 
167f0 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
16800 52 5f 54 48 52 45 41 44 53 3e 30 0a 20 20 20 20  R_THREADS>0.    
16810 69 66 28 20 70 53 6f 72 74 65 72 2d 3e 62 55 73  if( pSorter->bUs
16820 65 54 68 72 65 61 64 73 20 29 7b 0a 20 20 20 20  eThreads ){.    
16830 20 20 72 63 20 3d 20 76 64 62 65 50 6d 61 52 65    rc = vdbePmaRe
16840 61 64 65 72 4e 65 78 74 28 70 53 6f 72 74 65 72  aderNext(pSorter
16850 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20  ->pReader);.    
16860 20 20 2a 70 62 45 6f 66 20 3d 20 28 70 53 6f 72    *pbEof = (pSor
16870 74 65 72 2d 3e 70 52 65 61 64 65 72 2d 3e 70 46  ter->pReader->pF
16880 64 3d 3d 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d==0);.    }else
16890 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 69 66  .#endif.    /*if
168a0 28 20 21 70 53 6f 72 74 65 72 2d 3e 62 55 73 65  ( !pSorter->bUse
168b0 54 68 72 65 61 64 73 20 29 2a 2f 20 7b 0a 20 20  Threads )*/ {.  
168c0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72      assert( pSor
168d0 74 65 72 2d 3e 70 4d 65 72 67 65 72 21 3d 30 20  ter->pMerger!=0 
168e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
168f0 20 70 53 6f 72 74 65 72 2d 3e 70 4d 65 72 67 65   pSorter->pMerge
16900 72 2d 3e 70 54 61 73 6b 3d 3d 28 26 70 53 6f 72  r->pTask==(&pSor
16910 74 65 72 2d 3e 61 54 61 73 6b 5b 30 5d 29 20 29  ter->aTask[0]) )
16920 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76 64 62  ;.      rc = vdb
16930 65 4d 65 72 67 65 45 6e 67 69 6e 65 53 74 65 70  eMergeEngineStep
16940 28 70 53 6f 72 74 65 72 2d 3e 70 4d 65 72 67 65  (pSorter->pMerge
16950 72 2c 20 70 62 45 6f 66 29 3b 0a 20 20 20 20 7d  r, pbEof);.    }
16960 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 6f  .  }else{.    So
16970 72 74 65 72 52 65 63 6f 72 64 20 2a 70 46 72 65  rterRecord *pFre
16980 65 20 3d 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73  e = pSorter->lis
16990 74 2e 70 4c 69 73 74 3b 0a 20 20 20 20 70 53 6f  t.pList;.    pSo
169a0 72 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69 73 74  rter->list.pList
169b0 20 3d 20 70 46 72 65 65 2d 3e 75 2e 70 4e 65 78   = pFree->u.pNex
169c0 74 3b 0a 20 20 20 20 70 46 72 65 65 2d 3e 75 2e  t;.    pFree->u.
169d0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  pNext = 0;.    i
169e0 66 28 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74  f( pSorter->list
169f0 2e 61 4d 65 6d 6f 72 79 3d 3d 30 20 29 20 76 64  .aMemory==0 ) vd
16a00 62 65 53 6f 72 74 65 72 52 65 63 6f 72 64 46 72  beSorterRecordFr
16a10 65 65 28 64 62 2c 20 70 46 72 65 65 29 3b 0a 20  ee(db, pFree);. 
16a20 20 20 20 2a 70 62 45 6f 66 20 3d 20 21 70 53 6f     *pbEof = !pSo
16a30 72 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69 73 74  rter->list.pList
16a40 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
16a50 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
16a60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16a70 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
16a80 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 77 6e   to a buffer own
16a90 65 64 20 62 79 20 74 68 65 20 73 6f 72 74 65 72  ed by the sorter
16aa0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
16ab0 68 65 20 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6b  he .** current k
16ac0 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ey..*/.static vo
16ad0 69 64 20 2a 76 64 62 65 53 6f 72 74 65 72 52 6f  id *vdbeSorterRo
16ae0 77 6b 65 79 28 0a 20 20 63 6f 6e 73 74 20 56 64  wkey(.  const Vd
16af0 62 65 53 6f 72 74 65 72 20 2a 70 53 6f 72 74 65  beSorter *pSorte
16b00 72 2c 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65  r,      /* Sorte
16b10 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
16b20 74 20 2a 70 6e 4b 65 79 20 20 20 20 20 20 20 20  t *pnKey        
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16b40 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 63 75   OUT: Size of cu
16b50 72 72 65 6e 74 20 6b 65 79 20 69 6e 20 62 79 74  rrent key in byt
16b60 65 73 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  es */.){.  void 
16b70 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 53 6f  *pKey;.  if( pSo
16b80 72 74 65 72 2d 3e 62 55 73 65 50 4d 41 20 29 7b  rter->bUsePMA ){
16b90 0a 20 20 20 20 50 6d 61 52 65 61 64 65 72 20 2a  .    PmaReader *
16ba0 70 52 65 61 64 65 72 3b 0a 23 69 66 20 53 51 4c  pReader;.#if SQL
16bb0 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
16bc0 48 52 45 41 44 53 3e 30 0a 20 20 20 20 69 66 28  HREADS>0.    if(
16bd0 20 70 53 6f 72 74 65 72 2d 3e 62 55 73 65 54 68   pSorter->bUseTh
16be0 72 65 61 64 73 20 29 7b 0a 20 20 20 20 20 20 70  reads ){.      p
16bf0 52 65 61 64 65 72 20 3d 20 70 53 6f 72 74 65 72  Reader = pSorter
16c00 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20 7d  ->pReader;.    }
16c10 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
16c20 2f 2a 69 66 28 20 21 70 53 6f 72 74 65 72 2d 3e  /*if( !pSorter->
16c30 62 55 73 65 54 68 72 65 61 64 73 20 29 2a 2f 7b  bUseThreads )*/{
16c40 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 20 3d  .      pReader =
16c50 20 26 70 53 6f 72 74 65 72 2d 3e 70 4d 65 72 67   &pSorter->pMerg
16c60 65 72 2d 3e 61 52 65 61 64 72 5b 70 53 6f 72 74  er->aReadr[pSort
16c70 65 72 2d 3e 70 4d 65 72 67 65 72 2d 3e 61 54 72  er->pMerger->aTr
16c80 65 65 5b 31 5d 5d 3b 0a 20 20 20 20 7d 0a 20 20  ee[1]];.    }.  
16c90 20 20 2a 70 6e 4b 65 79 20 3d 20 70 52 65 61 64    *pnKey = pRead
16ca0 65 72 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 4b  er->nKey;.    pK
16cb0 65 79 20 3d 20 70 52 65 61 64 65 72 2d 3e 61 4b  ey = pReader->aK
16cc0 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ey;.  }else{.   
16cd0 20 2a 70 6e 4b 65 79 20 3d 20 70 53 6f 72 74 65   *pnKey = pSorte
16ce0 72 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 2d 3e 6e  r->list.pList->n
16cf0 56 61 6c 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20  Val;.    pKey = 
16d00 53 52 56 41 4c 28 70 53 6f 72 74 65 72 2d 3e 6c  SRVAL(pSorter->l
16d10 69 73 74 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a  ist.pList);.  }.
16d20 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d    return pKey;.}
16d30 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
16d40 20 63 75 72 72 65 6e 74 20 73 6f 72 74 65 72 20   current sorter 
16d50 6b 65 79 20 69 6e 74 6f 20 74 68 65 20 6d 65 6d  key into the mem
16d60 6f 72 79 20 63 65 6c 6c 20 70 4f 75 74 2e 0a 2a  ory cell pOut..*
16d70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
16d80 65 53 6f 72 74 65 72 52 6f 77 6b 65 79 28 63 6f  eSorterRowkey(co
16d90 6e 73 74 20 56 64 62 65 43 75 72 73 6f 72 20 2a  nst VdbeCursor *
16da0 70 43 73 72 2c 20 4d 65 6d 20 2a 70 4f 75 74 29  pCsr, Mem *pOut)
16db0 7b 0a 20 20 56 64 62 65 53 6f 72 74 65 72 20 2a  {.  VdbeSorter *
16dc0 70 53 6f 72 74 65 72 3b 0a 20 20 76 6f 69 64 20  pSorter;.  void 
16dd0 2a 70 4b 65 79 3b 20 69 6e 74 20 6e 4b 65 79 3b  *pKey; int nKey;
16de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
16df0 72 74 65 72 20 6b 65 79 20 74 6f 20 63 6f 70 79  rter key to copy
16e00 20 69 6e 74 6f 20 70 4f 75 74 20 2a 2f 0a 0a 20   into pOut */.. 
16e10 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 65   assert( pCsr->e
16e20 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
16e30 5f 53 4f 52 54 45 52 20 29 3b 0a 20 20 70 53 6f  _SORTER );.  pSo
16e40 72 74 65 72 20 3d 20 70 43 73 72 2d 3e 75 63 2e  rter = pCsr->uc.
16e50 70 53 6f 72 74 65 72 3b 0a 20 20 70 4b 65 79 20  pSorter;.  pKey 
16e60 3d 20 76 64 62 65 53 6f 72 74 65 72 52 6f 77 6b  = vdbeSorterRowk
16e70 65 79 28 70 53 6f 72 74 65 72 2c 20 26 6e 4b 65  ey(pSorter, &nKe
16e80 79 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  y);.  if( sqlite
16e90 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
16ea0 52 65 73 69 7a 65 28 70 4f 75 74 2c 20 6e 4b 65  Resize(pOut, nKe
16eb0 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  y) ){.    return
16ec0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
16ed0 50 54 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e  PT;.  }.  pOut->
16ee0 6e 20 3d 20 6e 4b 65 79 3b 0a 20 20 4d 65 6d 53  n = nKey;.  MemS
16ef0 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
16f00 20 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20 20 6d 65   MEM_Blob);.  me
16f10 6d 63 70 79 28 70 4f 75 74 2d 3e 7a 2c 20 70 4b  mcpy(pOut->z, pK
16f20 65 79 2c 20 6e 4b 65 79 29 3b 0a 0a 20 20 72 65  ey, nKey);..  re
16f30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16f40 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
16f50 20 74 68 65 20 6b 65 79 20 69 6e 20 6d 65 6d 6f   the key in memo
16f60 72 79 20 63 65 6c 6c 20 70 56 61 6c 20 77 69 74  ry cell pVal wit
16f70 68 20 74 68 65 20 6b 65 79 20 74 68 61 74 20 74  h the key that t
16f80 68 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72  he sorter cursor
16f90 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
16fa0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
16fb0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
16fc0 73 20 74 6f 2e 20 46 6f 72 20 74 68 65 20 70 75  s to. For the pu
16fd0 72 70 6f 73 65 73 20 6f 66 0a 2a 2a 20 74 68 65  rposes of.** the
16fe0 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 69 67 6e   comparison, ign
16ff0 6f 72 65 20 74 68 65 20 72 6f 77 69 64 20 66 69  ore the rowid fi
17000 65 6c 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  eld at the end o
17010 66 20 65 61 63 68 20 72 65 63 6f 72 64 2e 0a 2a  f each record..*
17020 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 72 74  *.** If the sort
17030 65 72 20 63 75 72 73 6f 72 20 6b 65 79 20 63 6f  er cursor key co
17040 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20  ntains any NULL 
17050 76 61 6c 75 65 73 2c 20 63 6f 6e 73 69 64 65 72  values, consider
17060 20 69 74 20 74 6f 20 62 65 0a 2a 2a 20 6c 65 73   it to be.** les
17070 73 20 74 68 61 6e 20 70 56 61 6c 2e 20 45 76 65  s than pVal. Eve
17080 6e 20 69 66 20 70 56 61 6c 20 61 6c 73 6f 20 63  n if pVal also c
17090 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c  ontains NULL val
170a0 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ues..**.** If an
170b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
170c0 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
170d0 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e  error code (i.e.
170e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 0a   SQLITE_NOMEM)..
170f0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  ** Otherwise, se
17100 74 20 2a 70 52 65 73 20 74 6f 20 61 20 6e 65 67  t *pRes to a neg
17110 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70  ative, zero or p
17120 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
17130 20 74 68 65 0a 2a 2a 20 6b 65 79 20 69 6e 20 70   the.** key in p
17140 56 61 6c 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  Val is smaller t
17150 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
17160 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
17170 20 63 75 72 72 65 6e 74 20 73 6f 72 74 65 72 0a   current sorter.
17180 2a 2a 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  ** key..**.** Th
17190 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 6d 73  is routine forms
171a0 20 74 68 65 20 63 6f 72 65 20 6f 66 20 74 68 65   the core of the
171b0 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72   OP_SorterCompar
171c0 65 20 6f 70 63 6f 64 65 2c 20 77 68 69 63 68 20  e opcode, which 
171d0 69 6e 0a 2a 2a 20 74 75 72 6e 20 69 73 20 75 73  in.** turn is us
171e0 65 64 20 74 6f 20 76 65 72 69 66 79 20 75 6e 69  ed to verify uni
171f0 71 75 65 6e 65 73 73 20 77 68 65 6e 20 63 6f 6e  queness when con
17200 73 74 72 75 63 74 69 6e 67 20 61 20 55 4e 49 51  structing a UNIQ
17210 55 45 20 49 4e 44 45 58 2e 0a 2a 2f 0a 69 6e 74  UE INDEX..*/.int
17220 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
17230 65 72 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e  erCompare(.  con
17240 73 74 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  st VdbeCursor *p
17250 43 73 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Csr,         /* 
17260 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 2a 2f  Sorter cursor */
17270 0a 20 20 4d 65 6d 20 2a 70 56 61 6c 2c 20 20 20  .  Mem *pVal,   
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17290 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 63     /* Value to c
172a0 6f 6d 70 61 72 65 20 74 6f 20 63 75 72 72 65 6e  ompare to curren
172b0 74 20 73 6f 72 74 65 72 20 6b 65 79 20 2a 2f 0a  t sorter key */.
172c0 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 2c 20 20    int nKeyCol,  
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172e0 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 74 68 69    /* Compare thi
172f0 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 2a  s many columns *
17300 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
17310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17320 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75      /* OUT: Resu
17330 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
17340 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 53 6f 72   */.){.  VdbeSor
17350 74 65 72 20 2a 70 53 6f 72 74 65 72 3b 0a 20 20  ter *pSorter;.  
17360 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
17370 72 32 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  r2;.  KeyInfo *p
17380 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 69  KeyInfo;.  int i
17390 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 20  ;.  void *pKey; 
173a0 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20  int nKey;       
173b0 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 6b 65      /* Sorter ke
173c0 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 56 61  y to compare pVa
173d0 6c 20 77 69 74 68 20 2a 2f 0a 0a 20 20 61 73 73  l with */..  ass
173e0 65 72 74 28 20 70 43 73 72 2d 3e 65 43 75 72 54  ert( pCsr->eCurT
173f0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 53 4f 52  ype==CURTYPE_SOR
17400 54 45 52 20 29 3b 0a 20 20 70 53 6f 72 74 65 72  TER );.  pSorter
17410 20 3d 20 70 43 73 72 2d 3e 75 63 2e 70 53 6f 72   = pCsr->uc.pSor
17420 74 65 72 3b 0a 20 20 72 32 20 3d 20 70 53 6f 72  ter;.  r2 = pSor
17430 74 65 72 2d 3e 70 55 6e 70 61 63 6b 65 64 3b 0a  ter->pUnpacked;.
17440 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 73    pKeyInfo = pCs
17450 72 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69  r->pKeyInfo;.  i
17460 66 28 20 72 32 3d 3d 30 20 29 7b 0a 20 20 20 20  f( r2==0 ){.    
17470 72 32 20 3d 20 70 53 6f 72 74 65 72 2d 3e 70 55  r2 = pSorter->pU
17480 6e 70 61 63 6b 65 64 20 3d 20 73 71 6c 69 74 65  npacked = sqlite
17490 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
174a0 65 64 52 65 63 6f 72 64 28 70 4b 65 79 49 6e 66  edRecord(pKeyInf
174b0 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d  o);.    if( r2==
174c0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
174d0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
174e0 20 20 72 32 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e    r2->nField = n
174f0 4b 65 79 43 6f 6c 3b 0a 20 20 7d 0a 20 20 61 73  KeyCol;.  }.  as
17500 73 65 72 74 28 20 72 32 2d 3e 6e 46 69 65 6c 64  sert( r2->nField
17510 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 0a 20 20  ==nKeyCol );..  
17520 70 4b 65 79 20 3d 20 76 64 62 65 53 6f 72 74 65  pKey = vdbeSorte
17530 72 52 6f 77 6b 65 79 28 70 53 6f 72 74 65 72 2c  rRowkey(pSorter,
17540 20 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74   &nKey);.  sqlit
17550 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
17560 63 6b 28 70 4b 65 79 49 6e 66 6f 2c 20 6e 4b 65  ck(pKeyInfo, nKe
17570 79 2c 20 70 4b 65 79 2c 20 72 32 29 3b 0a 20 20  y, pKey, r2);.  
17580 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 43  for(i=0; i<nKeyC
17590 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
175a0 28 20 72 32 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c  ( r2->aMem[i].fl
175b0 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
175c0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
175d0 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
175e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
175f0 7d 0a 20 20 7d 0a 0a 20 20 2a 70 52 65 73 20 3d  }.  }..  *pRes =
17600 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
17610 72 64 43 6f 6d 70 61 72 65 28 70 56 61 6c 2d 3e  rdCompare(pVal->
17620 6e 2c 20 70 56 61 6c 2d 3e 7a 2c 20 72 32 29 3b  n, pVal->z, r2);
17630 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17640 5f 4f 4b 3b 0a 7d 0a                             _OK;.}.