/ Hex Artifact Content
Login

Artifact 731a09e5cb9e96b70c394c1b7cf3860fbe84acca7682e178615eb941a3a0ef2f:


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 4b 65 79 46 69  pKeyInfo->nKeyFi
8470: 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  eld>1 ){.      r
8480: 65 73 20 3d 20 76 64 62 65 53 6f 72 74 65 72 43  es = vdbeSorterC
8490: 6f 6d 70 61 72 65 54 61 69 6c 28 0a 20 20 20 20  ompareTail(.    
84a0: 20 20 20 20 20 20 70 54 61 73 6b 2c 20 70 62 4b        pTask, pbK
84b0: 65 79 32 43 61 63 68 65 64 2c 20 70 4b 65 79 31  ey2Cached, pKey1
84c0: 2c 20 6e 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  , nKey1, pKey2, 
84d0: 6e 4b 65 79 32 0a 20 20 20 20 20 20 29 3b 0a 20  nKey2.      );. 
84e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
84f0: 20 20 69 66 28 20 70 54 61 73 6b 2d 3e 70 53 6f    if( pTask->pSo
8500: 72 74 65 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  rter->pKeyInfo->
8510: 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b  aSortOrder[0] ){
8520: 0a 20 20 20 20 20 20 72 65 73 20 3d 20 72 65 73  .      res = res
8530: 20 2a 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d   * -1;.    }.  }
8540: 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ..  return res;.
8550: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 70 65 63 69  }../*.** A speci
8560: 61 6c 6c 79 20 6f 70 74 69 6d 69 7a 65 64 20 76  ally optimized v
8570: 65 72 73 69 6f 6e 20 6f 66 20 76 64 62 65 53 6f  ersion of vdbeSo
8580: 72 74 65 72 43 6f 6d 70 61 72 65 28 29 20 74 68  rterCompare() th
8590: 61 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  at assumes that.
85a0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 66 69 65  ** the first fie
85b0: 6c 64 20 6f 66 20 65 61 63 68 20 6b 65 79 20 69  ld of each key i
85c0: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 76 61 6c  s an INTEGER val
85d0: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
85e0: 74 20 76 64 62 65 53 6f 72 74 65 72 43 6f 6d 70  t vdbeSorterComp
85f0: 61 72 65 49 6e 74 28 0a 20 20 53 6f 72 74 53 75  areInt(.  SortSu
8600: 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c 20 20 20  btask *pTask,   
8610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
8620: 74 61 73 6b 20 63 6f 6e 74 65 78 74 20 28 66 6f  task context (fo
8630: 72 20 70 4b 65 79 49 6e 66 6f 29 20 2a 2f 0a 20  r pKeyInfo) */. 
8640: 20 69 6e 74 20 2a 70 62 4b 65 79 32 43 61 63 68   int *pbKey2Cach
8650: 65 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ed,             
8660: 20 2f 2a 20 54 72 75 65 20 69 66 20 70 54 61 73   /* True if pTas
8670: 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 20 69 73 20  k->pUnpacked is 
8680: 70 4b 65 79 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  pKey2 */.  const
8690: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 69 6e   void *pKey1, in
86a0: 74 20 6e 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65  t nKey1,   /* Le
86b0: 66 74 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61  ft side of compa
86c0: 72 69 73 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  rison */.  const
86d0: 20 76 6f 69 64 20 2a 70 4b 65 79 32 2c 20 69 6e   void *pKey2, in
86e0: 74 20 6e 4b 65 79 32 20 20 20 20 2f 2a 20 52 69  t nKey2    /* Ri
86f0: 67 68 74 20 73 69 64 65 20 6f 66 20 63 6f 6d 70  ght side of comp
8700: 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 63  arison */.){.  c
8710: 6f 6e 73 74 20 75 38 20 2a 20 63 6f 6e 73 74 20  onst u8 * const 
8720: 70 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a  p1 = (const u8 *
8730: 20 63 6f 6e 73 74 29 70 4b 65 79 31 3b 0a 20 20   const)pKey1;.  
8740: 63 6f 6e 73 74 20 75 38 20 2a 20 63 6f 6e 73 74  const u8 * const
8750: 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 75 38 20   p2 = (const u8 
8760: 2a 20 63 6f 6e 73 74 29 70 4b 65 79 32 3b 0a 20  * const)pKey2;. 
8770: 20 63 6f 6e 73 74 20 69 6e 74 20 73 31 20 3d 20   const int s1 = 
8780: 70 31 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  p1[1];          
8790: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 68         /* Left h
87a0: 61 6e 64 20 73 65 72 69 61 6c 20 74 79 70 65 20  and serial type 
87b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73  */.  const int s
87c0: 32 20 3d 20 70 32 5b 31 5d 3b 20 20 20 20 20 20  2 = p2[1];      
87d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
87e0: 67 68 74 20 68 61 6e 64 20 73 65 72 69 61 6c 20  ght hand serial 
87f0: 74 79 70 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  type */.  const 
8800: 75 38 20 2a 20 63 6f 6e 73 74 20 76 31 20 3d 20  u8 * const v1 = 
8810: 26 70 31 5b 20 70 31 5b 30 5d 20 5d 3b 20 20 20  &p1[ p1[0] ];   
8820: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 61  /* Pointer to va
8830: 6c 75 65 20 31 20 2a 2f 0a 20 20 63 6f 6e 73 74  lue 1 */.  const
8840: 20 75 38 20 2a 20 63 6f 6e 73 74 20 76 32 20 3d   u8 * const v2 =
8850: 20 26 70 32 5b 20 70 32 5b 30 5d 20 5d 3b 20 20   &p2[ p2[0] ];  
8860: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
8870: 61 6c 75 65 20 32 20 2a 2f 0a 20 20 69 6e 74 20  alue 2 */.  int 
8880: 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
8890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88a0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
88b0: 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
88c0: 28 73 31 3e 30 20 26 26 20 73 31 3c 37 29 20 7c  (s1>0 && s1<7) |
88d0: 7c 20 73 31 3d 3d 38 20 7c 7c 20 73 31 3d 3d 39  | s1==8 || s1==9
88e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73   );.  assert( (s
88f0: 32 3e 30 20 26 26 20 73 32 3c 37 29 20 7c 7c 20  2>0 && s2<7) || 
8900: 73 32 3d 3d 38 20 7c 7c 20 73 32 3d 3d 39 20 29  s2==8 || s2==9 )
8910: 3b 0a 0a 20 20 69 66 28 20 73 31 3d 3d 73 32 20  ;..  if( s1==s2 
8920: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 77  ){.    /* The tw
8930: 6f 20 76 61 6c 75 65 73 20 68 61 76 65 20 74 68  o values have th
8940: 65 20 73 61 6d 65 20 73 69 67 6e 2e 20 43 6f 6d  e same sign. Com
8950: 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d  pare using memcm
8960: 70 28 29 2e 20 2a 2f 0a 20 20 20 20 73 74 61 74  p(). */.    stat
8970: 69 63 20 63 6f 6e 73 74 20 75 38 20 61 4c 65 6e  ic const u8 aLen
8980: 5b 5d 20 3d 20 7b 30 2c 20 31 2c 20 32 2c 20 33  [] = {0, 1, 2, 3
8990: 2c 20 34 2c 20 36 2c 20 38 2c 20 30 2c 20 30 2c  , 4, 6, 8, 0, 0,
89a0: 20 30 20 7d 3b 0a 20 20 20 20 63 6f 6e 73 74 20   0 };.    const 
89b0: 75 38 20 6e 20 3d 20 61 4c 65 6e 5b 73 31 5d 3b  u8 n = aLen[s1];
89c0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
89d0: 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  res = 0;.    for
89e0: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
89f0: 0a 20 20 20 20 20 20 69 66 28 20 28 72 65 73 20  .      if( (res 
8a00: 3d 20 76 31 5b 69 5d 20 2d 20 76 32 5b 69 5d 29  = v1[i] - v2[i])
8a10: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
8a20: 66 28 20 28 28 76 31 5b 30 5d 20 5e 20 76 32 5b  f( ((v1[0] ^ v2[
8a30: 30 5d 29 20 26 20 30 78 38 30 29 21 3d 30 20 29  0]) & 0x80)!=0 )
8a40: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  {.          res 
8a50: 3d 20 76 31 5b 30 5d 20 26 20 30 78 38 30 20 3f  = v1[0] & 0x80 ?
8a60: 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 20 20   -1 : +1;.      
8a70: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
8a80: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
8a90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 31 3e  .  }else if( s1>
8aa0: 37 20 26 26 20 73 32 3e 37 20 29 7b 0a 20 20 20  7 && s2>7 ){.   
8ab0: 20 72 65 73 20 3d 20 73 31 20 2d 20 73 32 3b 0a   res = s1 - s2;.
8ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
8ad0: 20 73 32 3e 37 20 29 7b 0a 20 20 20 20 20 20 72   s2>7 ){.      r
8ae0: 65 73 20 3d 20 2b 31 3b 0a 20 20 20 20 7d 65 6c  es = +1;.    }el
8af0: 73 65 20 69 66 28 20 73 31 3e 37 20 29 7b 0a 20  se if( s1>7 ){. 
8b00: 20 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20       res = -1;. 
8b10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8b20: 72 65 73 20 3d 20 73 31 20 2d 20 73 32 3b 0a 20  res = s1 - s2;. 
8b30: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
8b40: 20 72 65 73 21 3d 30 20 29 3b 0a 0a 20 20 20 20   res!=0 );..    
8b50: 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
8b60: 20 20 20 69 66 28 20 2a 76 31 20 26 20 30 78 38     if( *v1 & 0x8
8b70: 30 20 29 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20  0 ) res = -1;.  
8b80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
8b90: 66 28 20 2a 76 32 20 26 20 30 78 38 30 20 29 20  f( *v2 & 0x80 ) 
8ba0: 72 65 73 20 3d 20 2b 31 3b 0a 20 20 20 20 7d 0a  res = +1;.    }.
8bb0: 20 20 7d 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d    }..  if( res==
8bc0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61  0 ){.    if( pTa
8bd0: 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 70 4b 65  sk->pSorter->pKe
8be0: 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64  yInfo->nKeyField
8bf0: 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  >1 ){.      res 
8c00: 3d 20 76 64 62 65 53 6f 72 74 65 72 43 6f 6d 70  = vdbeSorterComp
8c10: 61 72 65 54 61 69 6c 28 0a 20 20 20 20 20 20 20  areTail(.       
8c20: 20 20 20 70 54 61 73 6b 2c 20 70 62 4b 65 79 32     pTask, pbKey2
8c30: 43 61 63 68 65 64 2c 20 70 4b 65 79 31 2c 20 6e  Cached, pKey1, n
8c40: 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 4b 65  Key1, pKey2, nKe
8c50: 79 32 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  y2.      );.    
8c60: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  }.  }else if( pT
8c70: 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 70 4b  ask->pSorter->pK
8c80: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
8c90: 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 65 73  er[0] ){.    res
8ca0: 20 3d 20 72 65 73 20 2a 20 2d 31 3b 0a 20 20 7d   = res * -1;.  }
8cb0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ..  return res;.
8cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
8cd0: 69 7a 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ize the temporar
8ce0: 79 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6a  y index cursor j
8cf0: 75 73 74 20 6f 70 65 6e 65 64 20 61 73 20 61 20  ust opened as a 
8d00: 73 6f 72 74 65 72 20 63 75 72 73 6f 72 2e 0a 2a  sorter cursor..*
8d10: 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68  *.** Usually, th
8d20: 65 20 73 6f 72 74 65 72 20 6d 6f 64 75 6c 65 20  e sorter module 
8d30: 75 73 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  uses the value o
8d40: 66 20 28 70 43 73 72 2d 3e 70 4b 65 79 49 6e 66  f (pCsr->pKeyInf
8d50: 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 0a 2a 2a  o->nKeyField).**
8d60: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
8d70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
8d80: 64 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ds that should b
8d90: 65 20 63 6f 6d 70 61 72 65 64 20 66 72 6f 6d 20  e compared from 
8da0: 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 73 20 62  the.** records b
8db0: 65 69 6e 67 20 73 6f 72 74 65 64 2e 20 48 6f 77  eing sorted. How
8dc0: 65 76 65 72 2c 20 69 66 20 74 68 65 20 76 61 6c  ever, if the val
8dd0: 75 65 20 70 61 73 73 65 64 20 61 73 20 61 72 67  ue passed as arg
8de0: 75 6d 65 6e 74 20 6e 46 69 65 6c 64 0a 2a 2a 20  ument nField.** 
8df0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
8e00: 74 68 65 20 73 6f 72 74 65 72 20 69 73 20 61 62  the sorter is ab
8e10: 6c 65 20 74 6f 20 67 75 61 72 61 6e 74 65 65 20  le to guarantee 
8e20: 61 20 73 74 61 62 6c 65 20 73 6f 72 74 2c 20 6e  a stable sort, n
8e30: 46 69 65 6c 64 0a 2a 2a 20 69 73 20 75 73 65 64  Field.** is used
8e40: 20 69 6e 73 74 65 61 64 2e 20 54 68 69 73 20 69   instead. This i
8e50: 73 20 75 73 65 64 20 77 68 65 6e 20 73 6f 72 74  s used when sort
8e60: 69 6e 67 20 72 65 63 6f 72 64 73 20 66 6f 72 20  ing records for 
8e70: 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 0a 2a  a CREATE INDEX.*
8e80: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 6e 20  * statement. In 
8e90: 74 68 69 73 20 63 61 73 65 2c 20 6b 65 79 73 20  this case, keys 
8ea0: 61 72 65 20 61 6c 77 61 79 73 20 64 65 6c 69 76  are always deliv
8eb0: 65 72 65 64 20 74 6f 20 74 68 65 20 73 6f 72 74  ered to the sort
8ec0: 65 72 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 6f  er in.** order o
8ed0: 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  f the primary ke
8ee0: 79 2c 20 77 68 69 63 68 20 68 61 70 70 65 6e 73  y, which happens
8ef0: 20 74 6f 20 62 65 20 6d 61 6b 65 20 75 70 20 74   to be make up t
8f00: 68 65 20 66 69 6e 61 6c 20 70 61 72 74 20 0a 2a  he final part .*
8f10: 2a 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 73  * of the records
8f20: 20 62 65 69 6e 67 20 73 6f 72 74 65 64 2e 20 53   being sorted. S
8f30: 6f 20 69 66 20 74 68 65 20 73 6f 72 74 20 69 73  o if the sort is
8f40: 20 73 74 61 62 6c 65 2c 20 74 68 65 72 65 20 69   stable, there i
8f50: 73 20 6e 65 76 65 72 0a 2a 2a 20 61 6e 79 20 72  s never.** any r
8f60: 65 61 73 6f 6e 20 74 6f 20 63 6f 6d 70 61 72 65  eason to compare
8f70: 20 50 4b 20 66 69 65 6c 64 73 20 61 6e 64 20 74   PK fields and t
8f80: 68 65 79 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  hey can be ignor
8f90: 65 64 20 66 6f 72 20 61 20 73 6d 61 6c 6c 0a 2a  ed for a small.*
8fa0: 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f  * performance bo
8fb0: 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ost..**.** The s
8fc0: 6f 72 74 65 72 20 63 61 6e 20 67 75 61 72 61 6e  orter can guaran
8fd0: 74 65 65 20 61 20 73 74 61 62 6c 65 20 73 6f 72  tee a stable sor
8fe0: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
8ff0: 6e 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65  n single-threade
9000: 64 0a 2a 2a 20 6d 6f 64 65 2c 20 62 75 74 20 6e  d.** mode, but n
9010: 6f 74 20 69 6e 20 6d 75 6c 74 69 2d 74 68 72 65  ot in multi-thre
9020: 61 64 65 64 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  aded mode..**.**
9030: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
9040: 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73  turned if succes
9050: 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
9060: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
9070: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
9080: 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
9090: 72 49 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33  rInit(.  sqlite3
90a0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
90b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
90c0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
90d0: 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 29 20 2a  (for malloc()) *
90e0: 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20  /.  int nField, 
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9100: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9110: 20 6b 65 79 20 66 69 65 6c 64 73 20 69 6e 20 65   key fields in e
9120: 61 63 68 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ach record */.  
9130: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72  VdbeCursor *pCsr
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 2f 2a 20 43 75 72 73 6f 72 20 74 68 61 74 20 68  /* Cursor that h
9160: 6f 6c 64 73 20 74 68 65 20 6e 65 77 20 73 6f 72  olds the new sor
9170: 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ter */.){.  int 
9180: 70 67 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20  pgsz;           
9190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
91a0: 61 67 65 20 73 69 7a 65 20 6f 66 20 6d 61 69 6e  age size of main
91b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
91c0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
91e0: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
91f0: 65 20 74 68 72 6f 75 67 68 20 61 54 61 73 6b 5b  e through aTask[
9200: 5d 20 2a 2f 0a 20 20 56 64 62 65 53 6f 72 74 65  ] */.  VdbeSorte
9210: 72 20 2a 70 53 6f 72 74 65 72 3b 20 20 20 20 20  r *pSorter;     
9220: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
9230: 77 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 4b 65  w sorter */.  Ke
9240: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9260: 20 43 6f 70 79 20 6f 66 20 70 43 73 72 2d 3e 70   Copy of pCsr->p
9270: 4b 65 79 49 6e 66 6f 20 77 69 74 68 20 64 62 3d  KeyInfo with db=
9280: 3d 30 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4b 65  =0 */.  int szKe
9290: 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
92a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
92b0: 6f 66 20 70 43 73 72 2d 3e 70 4b 65 79 49 6e 66  of pCsr->pKeyInf
92c0: 6f 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  o in bytes */.  
92d0: 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 6f 72 74  /* Size of pSort
9300: 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
9310: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
9320: 5f 4f 4b 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  _OK;.#if SQLITE_
9330: 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
9340: 44 53 3d 3d 30 0a 23 20 64 65 66 69 6e 65 20 6e  DS==0.# define n
9350: 57 6f 72 6b 65 72 20 30 0a 23 65 6c 73 65 0a 20  Worker 0.#else. 
9360: 20 69 6e 74 20 6e 57 6f 72 6b 65 72 3b 0a 23 65   int nWorker;.#e
9370: 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ndif..  /* Initi
9380: 61 6c 69 7a 65 20 74 68 65 20 75 70 70 65 72 20  alize the upper 
9390: 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
93a0: 62 65 72 20 6f 66 20 77 6f 72 6b 65 72 20 74 68  ber of worker th
93b0: 72 65 61 64 73 20 2a 2f 0a 23 69 66 20 53 51 4c  reads */.#if SQL
93c0: 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
93d0: 48 52 45 41 44 53 3e 30 0a 20 20 69 66 28 20 73  HREADS>0.  if( s
93e0: 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
93f0: 72 79 28 64 62 29 20 7c 7c 20 73 71 6c 69 74 65  ry(db) || sqlite
9400: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
9410: 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  oreMutex==0 ){. 
9420: 20 20 20 6e 57 6f 72 6b 65 72 20 3d 20 30 3b 0a     nWorker = 0;.
9430: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 57 6f    }else{.    nWo
9440: 72 6b 65 72 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  rker = db->aLimi
9450: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  t[SQLITE_LIMIT_W
9460: 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 3b 0a  ORKER_THREADS];.
9470: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
9480: 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68   Do not allow th
9490: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
94a0: 66 20 74 68 72 65 61 64 73 20 28 6d 61 69 6e 20  f threads (main 
94b0: 74 68 72 65 61 64 20 2b 20 61 6c 6c 20 77 6f 72  thread + all wor
94c0: 6b 65 72 73 29 0a 20 20 2a 2a 20 74 6f 20 65 78  kers).  ** to ex
94d0: 63 65 65 64 20 74 68 65 20 6d 61 78 69 6d 75 6d  ceed the maximum
94e0: 20 6d 65 72 67 65 20 63 6f 75 6e 74 20 2a 2f 0a   merge count */.
94f0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  #if SQLITE_MAX_W
9500: 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 3d 53  ORKER_THREADS>=S
9510: 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f  ORTER_MAX_MERGE_
9520: 43 4f 55 4e 54 0a 20 20 69 66 28 20 6e 57 6f 72  COUNT.  if( nWor
9530: 6b 65 72 3e 3d 53 4f 52 54 45 52 5f 4d 41 58 5f  ker>=SORTER_MAX_
9540: 4d 45 52 47 45 5f 43 4f 55 4e 54 20 29 7b 0a 20  MERGE_COUNT ){. 
9550: 20 20 20 6e 57 6f 72 6b 65 72 20 3d 20 53 4f 52     nWorker = SOR
9560: 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f  TER_MAX_MERGE_CO
9570: 55 4e 54 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  UNT-1;.  }.#endi
9580: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  f..  assert( pCs
9590: 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 26 26 20 70  r->pKeyInfo && p
95a0: 43 73 72 2d 3e 70 42 74 78 3d 3d 30 20 29 3b 0a  Csr->pBtx==0 );.
95b0: 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
95c0: 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
95d0: 45 5f 53 4f 52 54 45 52 20 29 3b 0a 20 20 73 7a  E_SORTER );.  sz
95e0: 4b 65 79 49 6e 66 6f 20 3d 20 73 69 7a 65 6f 66  KeyInfo = sizeof
95f0: 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 70 43 73  (KeyInfo) + (pCs
9600: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65  r->pKeyInfo->nKe
9610: 79 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66  yField-1)*sizeof
9620: 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 73 7a  (CollSeq*);.  sz
9630: 20 3d 20 73 69 7a 65 6f 66 28 56 64 62 65 53 6f   = sizeof(VdbeSo
9640: 72 74 65 72 29 20 2b 20 6e 57 6f 72 6b 65 72 20  rter) + nWorker 
9650: 2a 20 73 69 7a 65 6f 66 28 53 6f 72 74 53 75 62  * sizeof(SortSub
9660: 74 61 73 6b 29 3b 0a 0a 20 20 70 53 6f 72 74 65  task);..  pSorte
9670: 72 20 3d 20 28 56 64 62 65 53 6f 72 74 65 72 2a  r = (VdbeSorter*
9680: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
9690: 5a 65 72 6f 28 64 62 2c 20 73 7a 20 2b 20 73 7a  Zero(db, sz + sz
96a0: 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 70 43 73 72  KeyInfo);.  pCsr
96b0: 2d 3e 75 63 2e 70 53 6f 72 74 65 72 20 3d 20 70  ->uc.pSorter = p
96c0: 53 6f 72 74 65 72 3b 0a 20 20 69 66 28 20 70 53  Sorter;.  if( pS
96d0: 6f 72 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  orter==0 ){.    
96e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
96f0: 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  M_BKPT;.  }else{
9700: 0a 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 70 4b  .    pSorter->pK
9710: 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
9720: 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 28 28  o = (KeyInfo*)((
9730: 75 38 2a 29 70 53 6f 72 74 65 72 20 2b 20 73 7a  u8*)pSorter + sz
9740: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4b  );.    memcpy(pK
9750: 65 79 49 6e 66 6f 2c 20 70 43 73 72 2d 3e 70 4b  eyInfo, pCsr->pK
9760: 65 79 49 6e 66 6f 2c 20 73 7a 4b 65 79 49 6e 66  eyInfo, szKeyInf
9770: 6f 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  o);.    pKeyInfo
9780: 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20 69 66  ->db = 0;.    if
9790: 28 20 6e 46 69 65 6c 64 20 26 26 20 6e 57 6f 72  ( nField && nWor
97a0: 6b 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ker==0 ){.      
97b0: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
97c0: 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20  eld = nField;.  
97d0: 20 20 7d 0a 20 20 20 20 70 53 6f 72 74 65 72 2d    }.    pSorter-
97e0: 3e 70 67 73 7a 20 3d 20 70 67 73 7a 20 3d 20 73  >pgsz = pgsz = s
97f0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
9800: 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30  geSize(db->aDb[0
9810: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 70 53 6f 72  ].pBt);.    pSor
9820: 74 65 72 2d 3e 6e 54 61 73 6b 20 3d 20 6e 57 6f  ter->nTask = nWo
9830: 72 6b 65 72 20 2b 20 31 3b 0a 20 20 20 20 70 53  rker + 1;.    pS
9840: 6f 72 74 65 72 2d 3e 69 50 72 65 76 20 3d 20 28  orter->iPrev = (
9850: 75 38 29 28 6e 57 6f 72 6b 65 72 20 2d 20 31 29  u8)(nWorker - 1)
9860: 3b 0a 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 62  ;.    pSorter->b
9870: 55 73 65 54 68 72 65 61 64 73 20 3d 20 28 70 53  UseThreads = (pS
9880: 6f 72 74 65 72 2d 3e 6e 54 61 73 6b 3e 31 29 3b  orter->nTask>1);
9890: 0a 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 64 62  .    pSorter->db
98a0: 20 3d 20 64 62 3b 0a 20 20 20 20 66 6f 72 28 69   = db;.    for(i
98b0: 3d 30 3b 20 69 3c 70 53 6f 72 74 65 72 2d 3e 6e  =0; i<pSorter->n
98c0: 54 61 73 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Task; i++){.    
98d0: 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70    SortSubtask *p
98e0: 54 61 73 6b 20 3d 20 26 70 53 6f 72 74 65 72 2d  Task = &pSorter-
98f0: 3e 61 54 61 73 6b 5b 69 5d 3b 0a 20 20 20 20 20  >aTask[i];.     
9900: 20 70 54 61 73 6b 2d 3e 70 53 6f 72 74 65 72 20   pTask->pSorter 
9910: 3d 20 70 53 6f 72 74 65 72 3b 0a 20 20 20 20 7d  = pSorter;.    }
9920: 0a 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ..    if( !sqlit
9930: 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64  e3TempInMemory(d
9940: 62 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  b) ){.      i64 
9950: 6d 78 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  mxCache;        
9960: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
9970: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 2a 2f   size in bytes*/
9980: 0a 20 20 20 20 20 20 75 33 32 20 73 7a 50 6d 61  .      u32 szPma
9990: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
99a0: 43 6f 6e 66 69 67 2e 73 7a 50 6d 61 3b 0a 20 20  Config.szPma;.  
99b0: 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 6d 6e 50      pSorter->mnP
99c0: 6d 61 53 69 7a 65 20 3d 20 73 7a 50 6d 61 20 2a  maSize = szPma *
99d0: 20 70 67 73 7a 3b 0a 0a 20 20 20 20 20 20 6d 78   pgsz;..      mx
99e0: 43 61 63 68 65 20 3d 20 64 62 2d 3e 61 44 62 5b  Cache = db->aDb[
99f0: 30 5d 2e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68  0].pSchema->cach
9a00: 65 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  e_size;.      if
9a10: 28 20 6d 78 43 61 63 68 65 3c 30 20 29 7b 0a 20  ( mxCache<0 ){. 
9a20: 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 67 61         /* A nega
9a30: 74 69 76 65 20 63 61 63 68 65 2d 73 69 7a 65 20  tive cache-size 
9a40: 76 61 6c 75 65 20 43 20 69 6e 64 69 63 61 74 65  value C indicate
9a50: 73 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  s that the cache
9a60: 20 69 73 20 61 62 73 28 43 29 0a 20 20 20 20 20   is abs(C).     
9a70: 20 20 20 2a 2a 20 4b 69 42 20 69 6e 20 73 69 7a     ** KiB in siz
9a80: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  e.  */.        m
9a90: 78 43 61 63 68 65 20 3d 20 6d 78 43 61 63 68 65  xCache = mxCache
9aa0: 20 2a 20 2d 31 30 32 34 3b 0a 20 20 20 20 20 20   * -1024;.      
9ab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
9ac0: 78 43 61 63 68 65 20 3d 20 6d 78 43 61 63 68 65  xCache = mxCache
9ad0: 20 2a 20 70 67 73 7a 3b 0a 20 20 20 20 20 20 7d   * pgsz;.      }
9ae0: 0a 20 20 20 20 20 20 6d 78 43 61 63 68 65 20 3d  .      mxCache =
9af0: 20 4d 49 4e 28 6d 78 43 61 63 68 65 2c 20 53 51   MIN(mxCache, SQ
9b00: 4c 49 54 45 5f 4d 41 58 5f 50 4d 41 53 5a 29 3b  LITE_MAX_PMASZ);
9b10: 0a 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e  .      pSorter->
9b20: 6d 78 50 6d 61 53 69 7a 65 20 3d 20 4d 41 58 28  mxPmaSize = MAX(
9b30: 70 53 6f 72 74 65 72 2d 3e 6d 6e 50 6d 61 53 69  pSorter->mnPmaSi
9b40: 7a 65 2c 20 28 69 6e 74 29 6d 78 43 61 63 68 65  ze, (int)mxCache
9b50: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 76 6f  );..      /* Avo
9b60: 69 64 20 6c 61 72 67 65 20 6d 65 6d 6f 72 79 20  id large memory 
9b70: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 66 20 74  allocations if t
9b80: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 68  he application h
9b90: 61 73 20 72 65 71 75 65 73 74 65 64 0a 20 20 20  as requested.   
9ba0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     ** SQLITE_CON
9bb0: 46 49 47 5f 53 4d 41 4c 4c 5f 4d 41 4c 4c 4f 43  FIG_SMALL_MALLOC
9bc0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  . */.      if( s
9bd0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
9be0: 69 67 2e 62 53 6d 61 6c 6c 4d 61 6c 6c 6f 63 3d  ig.bSmallMalloc=
9bf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
9c00: 73 65 72 74 28 20 70 53 6f 72 74 65 72 2d 3e 69  sert( pSorter->i
9c10: 4d 65 6d 6f 72 79 3d 3d 30 20 29 3b 0a 20 20 20  Memory==0 );.   
9c20: 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 6e 4d       pSorter->nM
9c30: 65 6d 6f 72 79 20 3d 20 70 67 73 7a 3b 0a 20 20  emory = pgsz;.  
9c40: 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 6c        pSorter->l
9c50: 69 73 74 2e 61 4d 65 6d 6f 72 79 20 3d 20 28 75  ist.aMemory = (u
9c60: 38 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  8*)sqlite3Malloc
9c70: 28 70 67 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  (pgsz);.        
9c80: 69 66 28 20 21 70 53 6f 72 74 65 72 2d 3e 6c 69  if( !pSorter->li
9c90: 73 74 2e 61 4d 65 6d 6f 72 79 20 29 20 72 63 20  st.aMemory ) rc 
9ca0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
9cb0: 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
9cc0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4b 65 79   }..    if( pKey
9cd0: 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3c  Info->nAllField<
9ce0: 31 33 20 0a 20 20 20 20 20 26 26 20 28 70 4b 65  13 .     && (pKe
9cf0: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d  yInfo->aColl[0]=
9d00: 3d 30 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e  =0 || pKeyInfo->
9d10: 61 43 6f 6c 6c 5b 30 5d 3d 3d 64 62 2d 3e 70 44  aColl[0]==db->pD
9d20: 66 6c 74 43 6f 6c 6c 29 0a 20 20 20 20 29 7b 0a  fltColl).    ){.
9d30: 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 74        pSorter->t
9d40: 79 70 65 4d 61 73 6b 20 3d 20 53 4f 52 54 45 52  ypeMask = SORTER
9d50: 5f 54 59 50 45 5f 49 4e 54 45 47 45 52 20 7c 20  _TYPE_INTEGER | 
9d60: 53 4f 52 54 45 52 5f 54 59 50 45 5f 54 45 58 54  SORTER_TYPE_TEXT
9d70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
9d80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 75 6e 64  eturn rc;.}.#und
9d90: 65 66 20 6e 57 6f 72 6b 65 72 20 20 20 2f 2a 20  ef nWorker   /* 
9da0: 44 65 66 69 6e 65 64 20 61 74 20 74 68 65 20 74  Defined at the t
9db0: 6f 70 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  op of this funct
9dc0: 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 72  ion */../*.** Fr
9dd0: 65 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73  ee the list of s
9de0: 6f 72 74 65 64 20 72 65 63 6f 72 64 73 20 73 74  orted records st
9df0: 61 72 74 69 6e 67 20 61 74 20 70 52 65 63 6f 72  arting at pRecor
9e00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
9e10: 64 20 76 64 62 65 53 6f 72 74 65 72 52 65 63 6f  d vdbeSorterReco
9e20: 72 64 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a  rdFree(sqlite3 *
9e30: 64 62 2c 20 53 6f 72 74 65 72 52 65 63 6f 72 64  db, SorterRecord
9e40: 20 2a 70 52 65 63 6f 72 64 29 7b 0a 20 20 53 6f   *pRecord){.  So
9e50: 72 74 65 72 52 65 63 6f 72 64 20 2a 70 3b 0a 20  rterRecord *p;. 
9e60: 20 53 6f 72 74 65 72 52 65 63 6f 72 64 20 2a 70   SorterRecord *p
9e70: 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 52  Next;.  for(p=pR
9e80: 65 63 6f 72 64 3b 20 70 3b 20 70 3d 70 4e 65 78  ecord; p; p=pNex
9e90: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
9ea0: 70 2d 3e 75 2e 70 4e 65 78 74 3b 0a 20 20 20 20  p->u.pNext;.    
9eb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9ec0: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
9ed0: 2a 2a 20 46 72 65 65 20 61 6c 6c 20 72 65 73 6f  ** Free all reso
9ee0: 75 72 63 65 73 20 6f 77 6e 65 64 20 62 79 20 74  urces owned by t
9ef0: 68 65 20 6f 62 6a 65 63 74 20 69 6e 64 69 63 61  he object indica
9f00: 74 65 64 20 62 79 20 61 72 67 75 6d 65 6e 74 20  ted by argument 
9f10: 70 54 61 73 6b 2e 20 41 6c 6c 20 0a 2a 2a 20 66  pTask. All .** f
9f20: 69 65 6c 64 73 20 6f 66 20 2a 70 54 61 73 6b 20  ields of *pTask 
9f30: 61 72 65 20 7a 65 72 6f 65 64 20 62 65 66 6f 72  are zeroed befor
9f40: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
9f50: 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
9f60: 53 6f 72 74 53 75 62 74 61 73 6b 43 6c 65 61 6e  SortSubtaskClean
9f70: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
9f80: 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61  SortSubtask *pTa
9f90: 73 6b 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 62  sk){.  sqlite3Db
9fa0: 46 72 65 65 28 64 62 2c 20 70 54 61 73 6b 2d 3e  Free(db, pTask->
9fb0: 70 55 6e 70 61 63 6b 65 64 29 3b 0a 23 69 66 20  pUnpacked);.#if 
9fc0: 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
9fd0: 52 5f 54 48 52 45 41 44 53 3e 30 0a 20 20 2f 2a  R_THREADS>0.  /*
9fe0: 20 70 54 61 73 6b 2d 3e 6c 69 73 74 2e 61 4d 65   pTask->list.aMe
9ff0: 6d 6f 72 79 20 63 61 6e 20 6f 6e 6c 79 20 62 65  mory can only be
a000: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 69 74 20   non-zero if it 
a010: 77 61 73 20 68 61 6e 64 65 64 20 6d 65 6d 6f 72  was handed memor
a020: 79 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20  y.  ** from the 
a030: 6d 61 69 6e 20 74 68 72 65 61 64 2e 20 20 54 68  main thread.  Th
a040: 61 74 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 53  at only occurs S
a050: 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
a060: 5f 54 48 52 45 41 44 53 3e 30 20 2a 2f 0a 20 20  _THREADS>0 */.  
a070: 69 66 28 20 70 54 61 73 6b 2d 3e 6c 69 73 74 2e  if( pTask->list.
a080: 61 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 73  aMemory ){.    s
a090: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61 73  qlite3_free(pTas
a0a0: 6b 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 29  k->list.aMemory)
a0b0: 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
a0c0: 0a 20 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28  .  {.    assert(
a0d0: 20 70 54 61 73 6b 2d 3e 6c 69 73 74 2e 61 4d 65   pTask->list.aMe
a0e0: 6d 6f 72 79 3d 3d 30 20 29 3b 0a 20 20 20 20 76  mory==0 );.    v
a0f0: 64 62 65 53 6f 72 74 65 72 52 65 63 6f 72 64 46  dbeSorterRecordF
a100: 72 65 65 28 30 2c 20 70 54 61 73 6b 2d 3e 6c 69  ree(0, pTask->li
a110: 73 74 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  st.pList);.  }. 
a120: 20 69 66 28 20 70 54 61 73 6b 2d 3e 66 69 6c 65   if( pTask->file
a130: 2e 70 46 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  .pFd ){.    sqli
a140: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
a150: 54 61 73 6b 2d 3e 66 69 6c 65 2e 70 46 64 29 3b  Task->file.pFd);
a160: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 73 6b  .  }.  if( pTask
a170: 2d 3e 66 69 6c 65 32 2e 70 46 64 20 29 7b 0a 20  ->file2.pFd ){. 
a180: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
a190: 65 46 72 65 65 28 70 54 61 73 6b 2d 3e 66 69 6c  eFree(pTask->fil
a1a0: 65 32 2e 70 46 64 29 3b 0a 20 20 7d 0a 20 20 6d  e2.pFd);.  }.  m
a1b0: 65 6d 73 65 74 28 70 54 61 73 6b 2c 20 30 2c 20  emset(pTask, 0, 
a1c0: 73 69 7a 65 6f 66 28 53 6f 72 74 53 75 62 74 61  sizeof(SortSubta
a1d0: 73 6b 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  sk));.}..#ifdef 
a1e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 53 4f 52  SQLITE_DEBUG_SOR
a1f0: 54 45 52 5f 54 48 52 45 41 44 53 0a 73 74 61 74  TER_THREADS.stat
a200: 69 63 20 76 6f 69 64 20 76 64 62 65 53 6f 72 74  ic void vdbeSort
a210: 65 72 57 6f 72 6b 44 65 62 75 67 28 53 6f 72 74  erWorkDebug(Sort
a220: 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c 20  Subtask *pTask, 
a230: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 76 65  const char *zEve
a240: 6e 74 29 7b 0a 20 20 69 36 34 20 74 3b 0a 20 20  nt){.  i64 t;.  
a250: 69 6e 74 20 69 54 61 73 6b 20 3d 20 28 70 54 61  int iTask = (pTa
a260: 73 6b 20 2d 20 70 54 61 73 6b 2d 3e 70 53 6f 72  sk - pTask->pSor
a270: 74 65 72 2d 3e 61 54 61 73 6b 29 3b 0a 20 20 73  ter->aTask);.  s
a280: 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
a290: 69 6d 65 49 6e 74 36 34 28 70 54 61 73 6b 2d 3e  imeInt64(pTask->
a2a0: 70 53 6f 72 74 65 72 2d 3e 64 62 2d 3e 70 56 66  pSorter->db->pVf
a2b0: 73 2c 20 26 74 29 3b 0a 20 20 66 70 72 69 6e 74  s, &t);.  fprint
a2c0: 66 28 73 74 64 65 72 72 2c 20 22 25 6c 6c 64 3a  f(stderr, "%lld:
a2d0: 25 64 20 25 73 5c 6e 22 2c 20 74 2c 20 69 54 61  %d %s\n", t, iTa
a2e0: 73 6b 2c 20 7a 45 76 65 6e 74 29 3b 0a 7d 0a 73  sk, zEvent);.}.s
a2f0: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 53  tatic void vdbeS
a300: 6f 72 74 65 72 52 65 77 69 6e 64 44 65 62 75 67  orterRewindDebug
a310: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 76  (const char *zEv
a320: 65 6e 74 29 7b 0a 20 20 69 36 34 20 74 3b 0a 20  ent){.  i64 t;. 
a330: 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
a340: 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
a350: 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 2c 20  e3_vfs_find(0), 
a360: 26 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  &t);.  fprintf(s
a370: 74 64 65 72 72 2c 20 22 25 6c 6c 64 3a 58 20 25  tderr, "%lld:X %
a380: 73 5c 6e 22 2c 20 74 2c 20 7a 45 76 65 6e 74 29  s\n", t, zEvent)
a390: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
a3a0: 76 64 62 65 53 6f 72 74 65 72 50 6f 70 75 6c 61  vdbeSorterPopula
a3b0: 74 65 44 65 62 75 67 28 0a 20 20 53 6f 72 74 53  teDebug(.  SortS
a3c0: 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c 0a 20  ubtask *pTask,. 
a3d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 76   const char *zEv
a3e0: 65 6e 74 0a 29 7b 0a 20 20 69 36 34 20 74 3b 0a  ent.){.  i64 t;.
a3f0: 20 20 69 6e 74 20 69 54 61 73 6b 20 3d 20 28 70    int iTask = (p
a400: 54 61 73 6b 20 2d 20 70 54 61 73 6b 2d 3e 70 53  Task - pTask->pS
a410: 6f 72 74 65 72 2d 3e 61 54 61 73 6b 29 3b 0a 20  orter->aTask);. 
a420: 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
a430: 74 54 69 6d 65 49 6e 74 36 34 28 70 54 61 73 6b  tTimeInt64(pTask
a440: 2d 3e 70 53 6f 72 74 65 72 2d 3e 64 62 2d 3e 70  ->pSorter->db->p
a450: 56 66 73 2c 20 26 74 29 3b 0a 20 20 66 70 72 69  Vfs, &t);.  fpri
a460: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 6c 6c  ntf(stderr, "%ll
a470: 64 3a 62 67 25 64 20 25 73 5c 6e 22 2c 20 74 2c  d:bg%d %s\n", t,
a480: 20 69 54 61 73 6b 2c 20 7a 45 76 65 6e 74 29 3b   iTask, zEvent);
a490: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  .}.static void v
a4a0: 64 62 65 53 6f 72 74 65 72 42 6c 6f 63 6b 44 65  dbeSorterBlockDe
a4b0: 62 75 67 28 0a 20 20 53 6f 72 74 53 75 62 74 61  bug(.  SortSubta
a4c0: 73 6b 20 2a 70 54 61 73 6b 2c 0a 20 20 69 6e 74  sk *pTask,.  int
a4d0: 20 62 42 6c 6f 63 6b 65 64 2c 0a 20 20 63 6f 6e   bBlocked,.  con
a4e0: 73 74 20 63 68 61 72 20 2a 7a 45 76 65 6e 74 0a  st char *zEvent.
a4f0: 29 7b 0a 20 20 69 66 28 20 62 42 6c 6f 63 6b 65  ){.  if( bBlocke
a500: 64 20 29 7b 0a 20 20 20 20 69 36 34 20 74 3b 0a  d ){.    i64 t;.
a510: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 75 72      sqlite3OsCur
a520: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 54  rentTimeInt64(pT
a530: 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 64 62  ask->pSorter->db
a540: 2d 3e 70 56 66 73 2c 20 26 74 29 3b 0a 20 20 20  ->pVfs, &t);.   
a550: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
a560: 20 22 25 6c 6c 64 3a 6d 61 69 6e 20 25 73 5c 6e   "%lld:main %s\n
a570: 22 2c 20 74 2c 20 7a 45 76 65 6e 74 29 3b 0a 20  ", t, zEvent);. 
a580: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
a590: 69 6e 65 20 76 64 62 65 53 6f 72 74 65 72 57 6f  ine vdbeSorterWo
a5a0: 72 6b 44 65 62 75 67 28 78 2c 79 29 0a 23 20 64  rkDebug(x,y).# d
a5b0: 65 66 69 6e 65 20 76 64 62 65 53 6f 72 74 65 72  efine vdbeSorter
a5c0: 52 65 77 69 6e 64 44 65 62 75 67 28 79 29 0a 23  RewindDebug(y).#
a5d0: 20 64 65 66 69 6e 65 20 76 64 62 65 53 6f 72 74   define vdbeSort
a5e0: 65 72 50 6f 70 75 6c 61 74 65 44 65 62 75 67 28  erPopulateDebug(
a5f0: 78 2c 79 29 0a 23 20 64 65 66 69 6e 65 20 76 64  x,y).# define vd
a600: 62 65 53 6f 72 74 65 72 42 6c 6f 63 6b 44 65 62  beSorterBlockDeb
a610: 75 67 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  ug(x,y,z).#endif
a620: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
a630: 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e  _WORKER_THREADS>
a640: 30 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 68 72  0./*.** Join thr
a650: 65 61 64 20 70 54 61 73 6b 2d 3e 74 68 72 65 61  ead pTask->threa
a660: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
a670: 20 76 64 62 65 53 6f 72 74 65 72 4a 6f 69 6e 54   vdbeSorterJoinT
a680: 68 72 65 61 64 28 53 6f 72 74 53 75 62 74 61 73  hread(SortSubtas
a690: 6b 20 2a 70 54 61 73 6b 29 7b 0a 20 20 69 6e 74  k *pTask){.  int
a6a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a6b0: 0a 20 20 69 66 28 20 70 54 61 73 6b 2d 3e 70 54  .  if( pTask->pT
a6c0: 68 72 65 61 64 20 29 7b 0a 23 69 66 64 65 66 20  hread ){.#ifdef 
a6d0: 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 53 4f 52  SQLITE_DEBUG_SOR
a6e0: 54 45 52 5f 54 48 52 45 41 44 53 0a 20 20 20 20  TER_THREADS.    
a6f0: 69 6e 74 20 62 44 6f 6e 65 20 3d 20 70 54 61 73  int bDone = pTas
a700: 6b 2d 3e 62 44 6f 6e 65 3b 0a 23 65 6e 64 69 66  k->bDone;.#endif
a710: 0a 20 20 20 20 76 6f 69 64 20 2a 70 52 65 74 20  .    void *pRet 
a720: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  = SQLITE_INT_TO_
a730: 50 54 52 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  PTR(SQLITE_ERROR
a740: 29 3b 0a 20 20 20 20 76 64 62 65 53 6f 72 74 65  );.    vdbeSorte
a750: 72 42 6c 6f 63 6b 44 65 62 75 67 28 70 54 61 73  rBlockDebug(pTas
a760: 6b 2c 20 21 62 44 6f 6e 65 2c 20 22 65 6e 74 65  k, !bDone, "ente
a770: 72 22 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73  r");.    (void)s
a780: 71 6c 69 74 65 33 54 68 72 65 61 64 4a 6f 69 6e  qlite3ThreadJoin
a790: 28 70 54 61 73 6b 2d 3e 70 54 68 72 65 61 64 2c  (pTask->pThread,
a7a0: 20 26 70 52 65 74 29 3b 0a 20 20 20 20 76 64 62   &pRet);.    vdb
a7b0: 65 53 6f 72 74 65 72 42 6c 6f 63 6b 44 65 62 75  eSorterBlockDebu
a7c0: 67 28 70 54 61 73 6b 2c 20 21 62 44 6f 6e 65 2c  g(pTask, !bDone,
a7d0: 20 22 65 78 69 74 22 29 3b 0a 20 20 20 20 72 63   "exit");.    rc
a7e0: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
a7f0: 5f 49 4e 54 28 70 52 65 74 29 3b 0a 20 20 20 20  _INT(pRet);.    
a800: 61 73 73 65 72 74 28 20 70 54 61 73 6b 2d 3e 62  assert( pTask->b
a810: 44 6f 6e 65 3d 3d 31 20 29 3b 0a 20 20 20 20 70  Done==1 );.    p
a820: 54 61 73 6b 2d 3e 62 44 6f 6e 65 20 3d 20 30 3b  Task->bDone = 0;
a830: 0a 20 20 20 20 70 54 61 73 6b 2d 3e 70 54 68 72  .    pTask->pThr
a840: 65 61 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ead = 0;.  }.  r
a850: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a860: 2a 2a 20 4c 61 75 6e 63 68 20 61 20 62 61 63 6b  ** Launch a back
a870: 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 74 6f  ground thread to
a880: 20 72 75 6e 20 78 54 61 73 6b 28 70 49 6e 29 2e   run xTask(pIn).
a890: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
a8a0: 64 62 65 53 6f 72 74 65 72 43 72 65 61 74 65 54  dbeSorterCreateT
a8b0: 68 72 65 61 64 28 0a 20 20 53 6f 72 74 53 75 62  hread(.  SortSub
a8c0: 74 61 73 6b 20 2a 70 54 61 73 6b 2c 20 20 20 20  task *pTask,    
a8d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 72 65           /* Thre
a8e0: 61 64 20 77 69 6c 6c 20 75 73 65 20 74 68 69 73  ad will use this
a8f0: 20 74 61 73 6b 20 6f 62 6a 65 63 74 20 2a 2f 0a   task object */.
a900: 20 20 76 6f 69 64 20 2a 28 2a 78 54 61 73 6b 29    void *(*xTask)
a910: 28 76 6f 69 64 2a 29 2c 20 20 20 20 20 20 20 20  (void*),        
a920: 20 20 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20    /* Routine to 
a930: 72 75 6e 20 69 6e 20 61 20 73 65 70 61 72 61 74  run in a separat
a940: 65 20 74 68 72 65 61 64 20 2a 2f 0a 20 20 76 6f  e thread */.  vo
a950: 69 64 20 2a 70 49 6e 20 20 20 20 20 20 20 20 20  id *pIn         
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a970: 20 41 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   Argument passed
a980: 20 69 6e 74 6f 20 78 54 61 73 6b 28 29 20 2a 2f   into xTask() */
a990: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 54  .){.  assert( pT
a9a0: 61 73 6b 2d 3e 70 54 68 72 65 61 64 3d 3d 30 20  ask->pThread==0 
a9b0: 26 26 20 70 54 61 73 6b 2d 3e 62 44 6f 6e 65 3d  && pTask->bDone=
a9c0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
a9d0: 71 6c 69 74 65 33 54 68 72 65 61 64 43 72 65 61  qlite3ThreadCrea
a9e0: 74 65 28 26 70 54 61 73 6b 2d 3e 70 54 68 72 65  te(&pTask->pThre
a9f0: 61 64 2c 20 78 54 61 73 6b 2c 20 70 49 6e 29 3b  ad, xTask, pIn);
aa00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 61  .}../*.** Join a
aa10: 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 74  ll outstanding t
aa20: 68 72 65 61 64 73 20 6c 61 75 6e 63 68 65 64 20  hreads launched 
aa30: 62 79 20 53 6f 72 74 65 72 57 72 69 74 65 28 29  by SorterWrite()
aa40: 20 74 6f 20 63 72 65 61 74 65 20 0a 2a 2a 20 6c   to create .** l
aa50: 65 76 65 6c 2d 30 20 50 4d 41 73 2e 0a 2a 2f 0a  evel-0 PMAs..*/.
aa60: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 53  static int vdbeS
aa70: 6f 72 74 65 72 4a 6f 69 6e 41 6c 6c 28 56 64 62  orterJoinAll(Vdb
aa80: 65 53 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72  eSorter *pSorter
aa90: 2c 20 69 6e 74 20 72 63 69 6e 29 7b 0a 20 20 69  , int rcin){.  i
aaa0: 6e 74 20 72 63 20 3d 20 72 63 69 6e 3b 0a 20 20  nt rc = rcin;.  
aab0: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 54 68 69  int i;..  /* Thi
aac0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c  s function is al
aad0: 77 61 79 73 20 63 61 6c 6c 65 64 20 62 79 20 74  ways called by t
aae0: 68 65 20 6d 61 69 6e 20 75 73 65 72 20 74 68 72  he main user thr
aaf0: 65 61 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ead..  **.  ** I
ab00: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
ab10: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
ab20: 61 66 74 65 72 20 53 6f 72 74 65 72 52 65 77 69  after SorterRewi
ab30: 6e 64 28 29 20 68 61 73 20 62 65 65 6e 20 63 61  nd() has been ca
ab40: 6c 6c 65 64 2c 20 0a 20 20 2a 2a 20 69 74 20 69  lled, .  ** it i
ab50: 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
ab60: 74 68 72 65 61 64 20 70 53 6f 72 74 65 72 2d 3e  thread pSorter->
ab70: 61 54 61 73 6b 5b 70 53 6f 72 74 65 72 2d 3e 6e  aTask[pSorter->n
ab80: 54 61 73 6b 2d 31 5d 2e 70 54 68 72 65 61 64 0a  Task-1].pThread.
ab90: 20 20 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c    ** is currentl
aba0: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6a 6f 69  y attempt to joi
abb0: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74 68  n one of the oth
abc0: 65 72 20 74 68 72 65 61 64 73 2e 20 54 6f 20 61  er threads. To a
abd0: 76 6f 69 64 20 61 20 72 61 63 65 0a 20 20 2a 2a  void a race.  **
abe0: 20 63 6f 6e 64 69 74 69 6f 6e 20 77 68 65 72 65   condition where
abf0: 20 74 68 69 73 20 74 68 72 65 61 64 20 61 6c 73   this thread als
ac00: 6f 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6a 6f  o attempts to jo
ac10: 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65  in the same obje
ac20: 63 74 2c 20 6a 6f 69 6e 20 0a 20 20 2a 2a 20 74  ct, join .  ** t
ac30: 68 72 65 61 64 20 70 53 6f 72 74 65 72 2d 3e 61  hread pSorter->a
ac40: 54 61 73 6b 5b 70 53 6f 72 74 65 72 2d 3e 6e 54  Task[pSorter->nT
ac50: 61 73 6b 2d 31 5d 2e 70 54 68 72 65 61 64 20 66  ask-1].pThread f
ac60: 69 72 73 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  irst. */.  for(i
ac70: 3d 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73 6b 2d  =pSorter->nTask-
ac80: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
ac90: 20 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a     SortSubtask *
aca0: 70 54 61 73 6b 20 3d 20 26 70 53 6f 72 74 65 72  pTask = &pSorter
acb0: 2d 3e 61 54 61 73 6b 5b 69 5d 3b 0a 20 20 20 20  ->aTask[i];.    
acc0: 69 6e 74 20 72 63 32 20 3d 20 76 64 62 65 53 6f  int rc2 = vdbeSo
acd0: 72 74 65 72 4a 6f 69 6e 54 68 72 65 61 64 28 70  rterJoinThread(p
ace0: 54 61 73 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  Task);.    if( r
acf0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
ad00: 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 72  c = rc2;.  }.  r
ad10: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73  eturn rc;.}.#els
ad20: 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 53  e.# define vdbeS
ad30: 6f 72 74 65 72 4a 6f 69 6e 41 6c 6c 28 78 2c 72  orterJoinAll(x,r
ad40: 63 69 6e 29 20 28 72 63 69 6e 29 0a 23 20 64 65  cin) (rcin).# de
ad50: 66 69 6e 65 20 76 64 62 65 53 6f 72 74 65 72 4a  fine vdbeSorterJ
ad60: 6f 69 6e 54 68 72 65 61 64 28 70 54 61 73 6b 29  oinThread(pTask)
ad70: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
ad80: 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  f../*.** Allocat
ad90: 65 20 61 20 6e 65 77 20 4d 65 72 67 65 45 6e 67  e a new MergeEng
ada0: 69 6e 65 20 6f 62 6a 65 63 74 20 63 61 70 61 62  ine object capab
adb0: 6c 65 20 6f 66 20 68 61 6e 64 6c 69 6e 67 20 75  le of handling u
adc0: 70 20 74 6f 0a 2a 2a 20 6e 52 65 61 64 65 72 20  p to.** nReader 
add0: 50 6d 61 52 65 61 64 65 72 20 69 6e 70 75 74 73  PmaReader inputs
ade0: 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 61 64 65 72 20  ..**.** nReader 
adf0: 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
ae00: 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74   rounded up to t
ae10: 68 65 20 6e 65 78 74 20 70 6f 77 65 72 20 6f 66  he next power of
ae20: 20 74 77 6f 2e 0a 2a 2a 20 6e 52 65 61 64 65 72   two..** nReader
ae30: 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20   may not exceed 
ae40: 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45  SORTER_MAX_MERGE
ae50: 5f 43 4f 55 4e 54 20 65 76 65 6e 20 61 66 74 65  _COUNT even afte
ae60: 72 20 72 6f 75 6e 64 69 6e 67 20 75 70 2e 0a 2a  r rounding up..*
ae70: 2f 0a 73 74 61 74 69 63 20 4d 65 72 67 65 45 6e  /.static MergeEn
ae80: 67 69 6e 65 20 2a 76 64 62 65 4d 65 72 67 65 45  gine *vdbeMergeE
ae90: 6e 67 69 6e 65 4e 65 77 28 69 6e 74 20 6e 52 65  ngineNew(int nRe
aea0: 61 64 65 72 29 7b 0a 20 20 69 6e 74 20 4e 20 3d  ader){.  int N =
aeb0: 20 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   2;             
aec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c           /* Smal
aed0: 6c 65 73 74 20 70 6f 77 65 72 20 6f 66 20 74 77  lest power of tw
aee0: 6f 20 3e 3d 20 6e 52 65 61 64 65 72 20 2a 2f 0a  o >= nReader */.
aef0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 20 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65 73    /* Total bytes
af20: 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c   of space to all
af30: 6f 63 61 74 65 20 2a 2f 0a 20 20 4d 65 72 67 65  ocate */.  Merge
af40: 45 6e 67 69 6e 65 20 2a 70 4e 65 77 3b 20 20 20  Engine *pNew;   
af50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
af60: 69 6e 74 65 72 20 74 6f 20 61 6c 6c 6f 63 61 74  inter to allocat
af70: 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74  ed object to ret
af80: 75 72 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  urn */..  assert
af90: 28 20 6e 52 65 61 64 65 72 3c 3d 53 4f 52 54 45  ( nReader<=SORTE
afa0: 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55 4e  R_MAX_MERGE_COUN
afb0: 54 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 4e  T );..  while( N
afc0: 3c 6e 52 65 61 64 65 72 20 29 20 4e 20 2b 3d 20  <nReader ) N += 
afd0: 4e 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  N;.  nByte = siz
afe0: 65 6f 66 28 4d 65 72 67 65 45 6e 67 69 6e 65 29  eof(MergeEngine)
aff0: 20 2b 20 4e 20 2a 20 28 73 69 7a 65 6f 66 28 69   + N * (sizeof(i
b000: 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 50 6d 61  nt) + sizeof(Pma
b010: 52 65 61 64 65 72 29 29 3b 0a 0a 20 20 70 4e 65  Reader));..  pNe
b020: 77 20 3d 20 73 71 6c 69 74 65 33 46 61 75 6c 74  w = sqlite3Fault
b030: 53 69 6d 28 31 30 30 29 20 3f 20 30 20 3a 20 28  Sim(100) ? 0 : (
b040: 4d 65 72 67 65 45 6e 67 69 6e 65 2a 29 73 71 6c  MergeEngine*)sql
b050: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e  ite3MallocZero(n
b060: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 4e 65  Byte);.  if( pNe
b070: 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  w ){.    pNew->n
b080: 54 72 65 65 20 3d 20 4e 3b 0a 20 20 20 20 70 4e  Tree = N;.    pN
b090: 65 77 2d 3e 70 54 61 73 6b 20 3d 20 30 3b 0a 20  ew->pTask = 0;. 
b0a0: 20 20 20 70 4e 65 77 2d 3e 61 52 65 61 64 72 20     pNew->aReadr 
b0b0: 3d 20 28 50 6d 61 52 65 61 64 65 72 2a 29 26 70  = (PmaReader*)&p
b0c0: 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 70 4e 65 77  New[1];.    pNew
b0d0: 2d 3e 61 54 72 65 65 20 3d 20 28 69 6e 74 2a 29  ->aTree = (int*)
b0e0: 26 70 4e 65 77 2d 3e 61 52 65 61 64 72 5b 4e 5d  &pNew->aReadr[N]
b0f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
b100: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  New;.}../*.** Fr
b110: 65 65 20 74 68 65 20 4d 65 72 67 65 45 6e 67 69  ee the MergeEngi
b120: 6e 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  ne object passed
b130: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
b140: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
b150: 20 76 6f 69 64 20 76 64 62 65 4d 65 72 67 65 45   void vdbeMergeE
b160: 6e 67 69 6e 65 46 72 65 65 28 4d 65 72 67 65 45  ngineFree(MergeE
b170: 6e 67 69 6e 65 20 2a 70 4d 65 72 67 65 72 29 7b  ngine *pMerger){
b180: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
b190: 70 4d 65 72 67 65 72 20 29 7b 0a 20 20 20 20 66  pMerger ){.    f
b1a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 65 72 67 65  or(i=0; i<pMerge
b1b0: 72 2d 3e 6e 54 72 65 65 3b 20 69 2b 2b 29 7b 0a  r->nTree; i++){.
b1c0: 20 20 20 20 20 20 76 64 62 65 50 6d 61 52 65 61        vdbePmaRea
b1d0: 64 65 72 43 6c 65 61 72 28 26 70 4d 65 72 67 65  derClear(&pMerge
b1e0: 72 2d 3e 61 52 65 61 64 72 5b 69 5d 29 3b 0a 20  r->aReadr[i]);. 
b1f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
b200: 65 33 5f 66 72 65 65 28 70 4d 65 72 67 65 72 29  e3_free(pMerger)
b210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
b220: 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 61 73  all resources as
b230: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
b240: 65 20 49 6e 63 72 4d 65 72 67 65 72 20 6f 62 6a  e IncrMerger obj
b250: 65 63 74 20 69 6e 64 69 63 61 74 65 64 20 62 79  ect indicated by
b260: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
b270: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
b280: 63 20 76 6f 69 64 20 76 64 62 65 49 6e 63 72 46  c void vdbeIncrF
b290: 72 65 65 28 49 6e 63 72 4d 65 72 67 65 72 20 2a  ree(IncrMerger *
b2a0: 70 49 6e 63 72 29 7b 0a 20 20 69 66 28 20 70 49  pIncr){.  if( pI
b2b0: 6e 63 72 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ncr ){.#if SQLIT
b2c0: 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
b2d0: 45 41 44 53 3e 30 0a 20 20 20 20 69 66 28 20 70  EADS>0.    if( p
b2e0: 49 6e 63 72 2d 3e 62 55 73 65 54 68 72 65 61 64  Incr->bUseThread
b2f0: 20 29 7b 0a 20 20 20 20 20 20 76 64 62 65 53 6f   ){.      vdbeSo
b300: 72 74 65 72 4a 6f 69 6e 54 68 72 65 61 64 28 70  rterJoinThread(p
b310: 49 6e 63 72 2d 3e 70 54 61 73 6b 29 3b 0a 20 20  Incr->pTask);.  
b320: 20 20 20 20 69 66 28 20 70 49 6e 63 72 2d 3e 61      if( pIncr->a
b330: 46 69 6c 65 5b 30 5d 2e 70 46 64 20 29 20 73 71  File[0].pFd ) sq
b340: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
b350: 28 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 30 5d  (pIncr->aFile[0]
b360: 2e 70 46 64 29 3b 0a 20 20 20 20 20 20 69 66 28  .pFd);.      if(
b370: 20 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 31 5d   pIncr->aFile[1]
b380: 2e 70 46 64 20 29 20 73 71 6c 69 74 65 33 4f 73  .pFd ) sqlite3Os
b390: 43 6c 6f 73 65 46 72 65 65 28 70 49 6e 63 72 2d  CloseFree(pIncr-
b3a0: 3e 61 46 69 6c 65 5b 31 5d 2e 70 46 64 29 3b 0a  >aFile[1].pFd);.
b3b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b3c0: 20 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e 65   vdbeMergeEngine
b3d0: 46 72 65 65 28 70 49 6e 63 72 2d 3e 70 4d 65 72  Free(pIncr->pMer
b3e0: 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
b3f0: 33 5f 66 72 65 65 28 70 49 6e 63 72 29 3b 0a 20  3_free(pIncr);. 
b400: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65   }.}../*.** Rese
b410: 74 20 61 20 73 6f 72 74 69 6e 67 20 63 75 72 73  t a sorting curs
b420: 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  or back to its o
b430: 72 69 67 69 6e 61 6c 20 65 6d 70 74 79 20 73 74  riginal empty st
b440: 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ate..*/.void sql
b450: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 52 65  ite3VdbeSorterRe
b460: 73 65 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  set(sqlite3 *db,
b470: 20 56 64 62 65 53 6f 72 74 65 72 20 2a 70 53 6f   VdbeSorter *pSo
b480: 72 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rter){.  int i;.
b490: 20 20 28 76 6f 69 64 29 76 64 62 65 53 6f 72 74    (void)vdbeSort
b4a0: 65 72 4a 6f 69 6e 41 6c 6c 28 70 53 6f 72 74 65  erJoinAll(pSorte
b4b0: 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  r, SQLITE_OK);. 
b4c0: 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 65 72   assert( pSorter
b4d0: 2d 3e 62 55 73 65 54 68 72 65 61 64 73 20 7c 7c  ->bUseThreads ||
b4e0: 20 70 53 6f 72 74 65 72 2d 3e 70 52 65 61 64 65   pSorter->pReade
b4f0: 72 3d 3d 30 20 29 3b 0a 23 69 66 20 53 51 4c 49  r==0 );.#if SQLI
b500: 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
b510: 52 45 41 44 53 3e 30 0a 20 20 69 66 28 20 70 53  READS>0.  if( pS
b520: 6f 72 74 65 72 2d 3e 70 52 65 61 64 65 72 20 29  orter->pReader )
b530: 7b 0a 20 20 20 20 76 64 62 65 50 6d 61 52 65 61  {.    vdbePmaRea
b540: 64 65 72 43 6c 65 61 72 28 70 53 6f 72 74 65 72  derClear(pSorter
b550: 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20  ->pReader);.    
b560: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b570: 2c 20 70 53 6f 72 74 65 72 2d 3e 70 52 65 61 64  , pSorter->pRead
b580: 65 72 29 3b 0a 20 20 20 20 70 53 6f 72 74 65 72  er);.    pSorter
b590: 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  ->pReader = 0;. 
b5a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 76 64 62 65   }.#endif.  vdbe
b5b0: 4d 65 72 67 65 45 6e 67 69 6e 65 46 72 65 65 28  MergeEngineFree(
b5c0: 70 53 6f 72 74 65 72 2d 3e 70 4d 65 72 67 65 72  pSorter->pMerger
b5d0: 29 3b 0a 20 20 70 53 6f 72 74 65 72 2d 3e 70 4d  );.  pSorter->pM
b5e0: 65 72 67 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72  erger = 0;.  for
b5f0: 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74 65 72 2d  (i=0; i<pSorter-
b600: 3e 6e 54 61 73 6b 3b 20 69 2b 2b 29 7b 0a 20 20  >nTask; i++){.  
b610: 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70    SortSubtask *p
b620: 54 61 73 6b 20 3d 20 26 70 53 6f 72 74 65 72 2d  Task = &pSorter-
b630: 3e 61 54 61 73 6b 5b 69 5d 3b 0a 20 20 20 20 76  >aTask[i];.    v
b640: 64 62 65 53 6f 72 74 53 75 62 74 61 73 6b 43 6c  dbeSortSubtaskCl
b650: 65 61 6e 75 70 28 64 62 2c 20 70 54 61 73 6b 29  eanup(db, pTask)
b660: 3b 0a 20 20 20 20 70 54 61 73 6b 2d 3e 70 53 6f  ;.    pTask->pSo
b670: 72 74 65 72 20 3d 20 70 53 6f 72 74 65 72 3b 0a  rter = pSorter;.
b680: 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 65    }.  if( pSorte
b690: 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 3d  r->list.aMemory=
b6a0: 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65 53 6f  =0 ){.    vdbeSo
b6b0: 72 74 65 72 52 65 63 6f 72 64 46 72 65 65 28 30  rterRecordFree(0
b6c0: 2c 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e  , pSorter->list.
b6d0: 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70 53  pList);.  }.  pS
b6e0: 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69 73  orter->list.pLis
b6f0: 74 20 3d 20 30 3b 0a 20 20 70 53 6f 72 74 65 72  t = 0;.  pSorter
b700: 2d 3e 6c 69 73 74 2e 73 7a 50 4d 41 20 3d 20 30  ->list.szPMA = 0
b710: 3b 0a 20 20 70 53 6f 72 74 65 72 2d 3e 62 55 73  ;.  pSorter->bUs
b720: 65 50 4d 41 20 3d 20 30 3b 0a 20 20 70 53 6f 72  ePMA = 0;.  pSor
b730: 74 65 72 2d 3e 69 4d 65 6d 6f 72 79 20 3d 20 30  ter->iMemory = 0
b740: 3b 0a 20 20 70 53 6f 72 74 65 72 2d 3e 6d 78 4b  ;.  pSorter->mxK
b750: 65 79 73 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71  eysize = 0;.  sq
b760: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b770: 70 53 6f 72 74 65 72 2d 3e 70 55 6e 70 61 63 6b  pSorter->pUnpack
b780: 65 64 29 3b 0a 20 20 70 53 6f 72 74 65 72 2d 3e  ed);.  pSorter->
b790: 70 55 6e 70 61 63 6b 65 64 20 3d 20 30 3b 0a 7d  pUnpacked = 0;.}
b7a0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
b7b0: 20 63 75 72 73 6f 72 20 63 6f 6d 70 6f 6e 65 6e   cursor componen
b7c0: 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ts allocated by 
b7d0: 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
b7e0: 72 58 58 58 20 72 6f 75 74 69 6e 65 73 2e 0a 2a  rXXX routines..*
b7f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b800: 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 73 71  beSorterClose(sq
b810: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 43  lite3 *db, VdbeC
b820: 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20  ursor *pCsr){.  
b830: 56 64 62 65 53 6f 72 74 65 72 20 2a 70 53 6f 72  VdbeSorter *pSor
b840: 74 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ter;.  assert( p
b850: 43 73 72 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  Csr->eCurType==C
b860: 55 52 54 59 50 45 5f 53 4f 52 54 45 52 20 29 3b  URTYPE_SORTER );
b870: 0a 20 20 70 53 6f 72 74 65 72 20 3d 20 70 43 73  .  pSorter = pCs
b880: 72 2d 3e 75 63 2e 70 53 6f 72 74 65 72 3b 0a 20  r->uc.pSorter;. 
b890: 20 69 66 28 20 70 53 6f 72 74 65 72 20 29 7b 0a   if( pSorter ){.
b8a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
b8b0: 6f 72 74 65 72 52 65 73 65 74 28 64 62 2c 20 70  orterReset(db, p
b8c0: 53 6f 72 74 65 72 29 3b 0a 20 20 20 20 73 71 6c  Sorter);.    sql
b8d0: 69 74 65 33 5f 66 72 65 65 28 70 53 6f 72 74 65  ite3_free(pSorte
b8e0: 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 29  r->list.aMemory)
b8f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
b900: 72 65 65 28 64 62 2c 20 70 53 6f 72 74 65 72 29  ree(db, pSorter)
b910: 3b 0a 20 20 20 20 70 43 73 72 2d 3e 75 63 2e 70  ;.    pCsr->uc.p
b920: 53 6f 72 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a  Sorter = 0;.  }.
b930: 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
b940: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
b950: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
b960: 67 75 6d 65 6e 74 20 69 73 20 61 20 66 69 6c 65  gument is a file
b970: 2d 68 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20  -handle open on 
b980: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
b990: 2e 20 54 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73  . The file.** is
b9a0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
b9b0: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 72  e nByte bytes or
b9c0: 20 73 6d 61 6c 6c 65 72 20 69 6e 20 73 69 7a 65   smaller in size
b9d0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  . This function.
b9e0: 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65  ** attempts to e
b9f0: 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65 20 74  xtend the file t
ba00: 6f 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e  o nByte bytes in
ba10: 20 73 69 7a 65 20 61 6e 64 20 74 6f 20 65 6e 73   size and to ens
ba20: 75 72 65 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ure that.** the 
ba30: 56 46 53 20 68 61 73 20 6d 65 6d 6f 72 79 20 6d  VFS has memory m
ba40: 61 70 70 65 64 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  apped it..**.** 
ba50: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
ba60: 68 65 20 66 69 6c 65 20 64 6f 65 73 20 65 6e 64  he file does end
ba70: 20 75 70 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65   up memory mappe
ba80: 64 20 6f 66 20 63 6f 75 72 73 65 20 64 65 70 65  d of course depe
ba90: 6e 64 73 20 6f 6e 0a 2a 2a 20 74 68 65 20 73 70  nds on.** the sp
baa0: 65 63 69 66 69 63 20 56 46 53 20 69 6d 70 6c 65  ecific VFS imple
bab0: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  mentation..*/.st
bac0: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 53 6f  atic void vdbeSo
bad0: 72 74 65 72 45 78 74 65 6e 64 46 69 6c 65 28 73  rterExtendFile(s
bae0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69  qlite3 *db, sqli
baf0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69  te3_file *pFd, i
bb00: 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28  64 nByte){.  if(
bb10: 20 6e 42 79 74 65 3c 3d 28 69 36 34 29 28 64 62   nByte<=(i64)(db
bb20: 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70  ->nMaxSorterMmap
bb30: 29 20 26 26 20 70 46 64 2d 3e 70 4d 65 74 68 6f  ) && pFd->pMetho
bb40: 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20  ds->iVersion>=3 
bb50: 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 20 3d  ){.    void *p =
bb60: 20 30 3b 0a 20 20 20 20 69 6e 74 20 63 68 75 6e   0;.    int chun
bb70: 6b 73 69 7a 65 20 3d 20 34 2a 31 30 32 34 3b 0a  ksize = 4*1024;.
bb80: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
bb90: 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 64  eControlHint(pFd
bba0: 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  , SQLITE_FCNTL_C
bbb0: 48 55 4e 4b 5f 53 49 5a 45 2c 20 26 63 68 75 6e  HUNK_SIZE, &chun
bbc0: 6b 73 69 7a 65 29 3b 0a 20 20 20 20 73 71 6c 69  ksize);.    sqli
bbd0: 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
bbe0: 48 69 6e 74 28 70 46 64 2c 20 53 51 4c 49 54 45  Hint(pFd, SQLITE
bbf0: 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
bc00: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 73  , &nByte);.    s
bc10: 71 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70 46  qlite3OsFetch(pF
bc20: 64 2c 20 30 2c 20 28 69 6e 74 29 6e 42 79 74 65  d, 0, (int)nByte
bc30: 2c 20 26 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  , &p);.    sqlit
bc40: 65 33 4f 73 55 6e 66 65 74 63 68 28 70 46 64 2c  e3OsUnfetch(pFd,
bc50: 20 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65   0, p);.  }.}.#e
bc60: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62  lse.# define vdb
bc70: 65 53 6f 72 74 65 72 45 78 74 65 6e 64 46 69 6c  eSorterExtendFil
bc80: 65 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  e(x,y,z).#endif.
bc90: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
bca0: 73 70 61 63 65 20 66 6f 72 20 61 20 66 69 6c 65  space for a file
bcb0: 2d 68 61 6e 64 6c 65 20 61 6e 64 20 6f 70 65 6e  -handle and open
bcc0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
bcd0: 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  e. If successful
bce0: 2c 0a 2a 2a 20 73 65 74 20 2a 70 70 46 64 20 74  ,.** set *ppFd t
bcf0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
bd00: 61 6c 6c 6f 63 27 64 20 66 69 6c 65 2d 68 61 6e  alloc'd file-han
bd10: 64 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53  dle and return S
bd20: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68  QLITE_OK..** Oth
bd30: 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70 46  erwise, set *ppF
bd40: 64 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72  d to 0 and retur
bd50: 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
bd60: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
bd70: 63 20 69 6e 74 20 76 64 62 65 53 6f 72 74 65 72  c int vdbeSorter
bd80: 4f 70 65 6e 54 65 6d 70 46 69 6c 65 28 0a 20 20  OpenTempFile(.  
bd90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
bdc0: 6c 65 20 64 6f 69 6e 67 20 73 6f 72 74 20 2a 2f  le doing sort */
bdd0: 0a 20 20 69 36 34 20 6e 45 78 74 65 6e 64 2c 20  .  i64 nExtend, 
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f     /* Attempt to
be00: 20 65 78 74 65 6e 64 20 66 69 6c 65 20 74 6f 20   extend file to 
be10: 74 68 69 73 20 73 69 7a 65 20 2a 2f 0a 20 20 73  this size */.  s
be20: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 2a 70 70  qlite3_file **pp
be30: 46 64 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Fd.){.  int rc;.
be40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 61 75    if( sqlite3Fau
be50: 6c 74 53 69 6d 28 32 30 32 29 20 29 20 72 65 74  ltSim(202) ) ret
be60: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
be70: 5f 41 43 43 45 53 53 3b 0a 20 20 72 63 20 3d 20  _ACCESS;.  rc = 
be80: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c  sqlite3OsOpenMal
be90: 6c 6f 63 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c  loc(db->pVfs, 0,
bea0: 20 70 70 46 64 2c 0a 20 20 20 20 20 20 53 51 4c   ppFd,.      SQL
beb0: 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
bec0: 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 53 51  URNAL |.      SQ
bed0: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
bee0: 49 54 45 20 20 20 20 7c 20 53 51 4c 49 54 45 5f  ITE    | SQLITE_
bef0: 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
bf00: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
bf10: 45 58 43 4c 55 53 49 56 45 20 20 20 20 7c 20 53  EXCLUSIVE    | S
bf20: 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
bf30: 45 4f 4e 43 4c 4f 53 45 2c 20 26 72 63 0a 20 20  EONCLOSE, &rc.  
bf40: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
bf50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 36  ITE_OK ){.    i6
bf60: 34 20 6d 61 78 20 3d 20 53 51 4c 49 54 45 5f 4d  4 max = SQLITE_M
bf70: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20  AX_MMAP_SIZE;.  
bf80: 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
bf90: 6f 6e 74 72 6f 6c 48 69 6e 74 28 2a 70 70 46 64  ontrolHint(*ppFd
bfa0: 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  , SQLITE_FCNTL_M
bfb0: 4d 41 50 5f 53 49 5a 45 2c 20 28 76 6f 69 64 2a  MAP_SIZE, (void*
bfc0: 29 26 6d 61 78 29 3b 0a 20 20 20 20 69 66 28 20  )&max);.    if( 
bfd0: 6e 45 78 74 65 6e 64 3e 30 20 29 7b 0a 20 20 20  nExtend>0 ){.   
bfe0: 20 20 20 76 64 62 65 53 6f 72 74 65 72 45 78 74     vdbeSorterExt
bff0: 65 6e 64 46 69 6c 65 28 64 62 2c 20 2a 70 70 46  endFile(db, *ppF
c000: 64 2c 20 6e 45 78 74 65 6e 64 29 3b 0a 20 20 20  d, nExtend);.   
c010: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
c020: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
c030: 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  it has not alrea
c040: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
c050: 64 2c 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  d, allocate the 
c060: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 0a  UnpackedRecord .
c070: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61 74 20  ** structure at 
c080: 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64  pTask->pUnpacked
c090: 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
c0a0: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
c0b0: 20 28 6f 72 20 0a 2a 2a 20 69 66 20 6e 6f 20 61   (or .** if no a
c0c0: 6c 6c 6f 63 61 74 69 6f 6e 20 77 61 73 20 72 65  llocation was re
c0d0: 71 75 69 72 65 64 29 2c 20 6f 72 20 53 51 4c 49  quired), or SQLI
c0e0: 54 45 5f 4e 4f 4d 45 4d 20 6f 74 68 65 72 77 69  TE_NOMEM otherwi
c0f0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
c100: 74 20 76 64 62 65 53 6f 72 74 41 6c 6c 6f 63 55  t vdbeSortAllocU
c110: 6e 70 61 63 6b 65 64 28 53 6f 72 74 53 75 62 74  npacked(SortSubt
c120: 61 73 6b 20 2a 70 54 61 73 6b 29 7b 0a 20 20 69  ask *pTask){.  i
c130: 66 28 20 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63  f( pTask->pUnpac
c140: 6b 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54  ked==0 ){.    pT
c150: 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 20 3d  ask->pUnpacked =
c160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
c170: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
c180: 70 54 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e  pTask->pSorter->
c190: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
c1a0: 66 28 20 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63  f( pTask->pUnpac
c1b0: 6b 65 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ked==0 ) return 
c1c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
c1d0: 54 3b 0a 20 20 20 20 70 54 61 73 6b 2d 3e 70 55  T;.    pTask->pU
c1e0: 6e 70 61 63 6b 65 64 2d 3e 6e 46 69 65 6c 64 20  npacked->nField 
c1f0: 3d 20 70 54 61 73 6b 2d 3e 70 53 6f 72 74 65 72  = pTask->pSorter
c200: 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79  ->pKeyInfo->nKey
c210: 46 69 65 6c 64 3b 0a 20 20 20 20 70 54 61 73 6b  Field;.    pTask
c220: 2d 3e 70 55 6e 70 61 63 6b 65 64 2d 3e 65 72 72  ->pUnpacked->err
c230: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Code = 0;.  }.  
c240: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c250: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67  ;.}.../*.** Merg
c260: 65 20 74 68 65 20 74 77 6f 20 73 6f 72 74 65 64  e the two sorted
c270: 20 6c 69 73 74 73 20 70 31 20 61 6e 64 20 70 32   lists p1 and p2
c280: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c   into a single l
c290: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ist..*/.static S
c2a0: 6f 72 74 65 72 52 65 63 6f 72 64 20 2a 76 64 62  orterRecord *vdb
c2b0: 65 53 6f 72 74 65 72 4d 65 72 67 65 28 0a 20 20  eSorterMerge(.  
c2c0: 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61  SortSubtask *pTa
c2d0: 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sk,             
c2e0: 2f 2a 20 43 61 6c 6c 69 6e 67 20 74 68 72 65 61  /* Calling threa
c2f0: 64 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  d context */.  S
c300: 6f 72 74 65 72 52 65 63 6f 72 64 20 2a 70 31 2c  orterRecord *p1,
c310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c320: 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20  * First list to 
c330: 6d 65 72 67 65 20 2a 2f 0a 20 20 53 6f 72 74 65  merge */.  Sorte
c340: 72 52 65 63 6f 72 64 20 2a 70 32 20 20 20 20 20  rRecord *p2     
c350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c360: 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72  cond list to mer
c370: 67 65 20 2a 2f 0a 29 7b 0a 20 20 53 6f 72 74 65  ge */.){.  Sorte
c380: 72 52 65 63 6f 72 64 20 2a 70 46 69 6e 61 6c 20  rRecord *pFinal 
c390: 3d 20 30 3b 0a 20 20 53 6f 72 74 65 72 52 65 63  = 0;.  SorterRec
c3a0: 6f 72 64 20 2a 2a 70 70 20 3d 20 26 70 46 69 6e  ord **pp = &pFin
c3b0: 61 6c 3b 0a 20 20 69 6e 74 20 62 43 61 63 68 65  al;.  int bCache
c3c0: 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  d = 0;..  assert
c3d0: 28 20 70 31 21 3d 30 20 26 26 20 70 32 21 3d 30  ( p1!=0 && p2!=0
c3e0: 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20   );.  for(;;){. 
c3f0: 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
c400: 72 65 73 20 3d 20 70 54 61 73 6b 2d 3e 78 43 6f  res = pTask->xCo
c410: 6d 70 61 72 65 28 0a 20 20 20 20 20 20 20 20 70  mpare(.        p
c420: 54 61 73 6b 2c 20 26 62 43 61 63 68 65 64 2c 20  Task, &bCached, 
c430: 53 52 56 41 4c 28 70 31 29 2c 20 70 31 2d 3e 6e  SRVAL(p1), p1->n
c440: 56 61 6c 2c 20 53 52 56 41 4c 28 70 32 29 2c 20  Val, SRVAL(p2), 
c450: 70 32 2d 3e 6e 56 61 6c 0a 20 20 20 20 29 3b 0a  p2->nVal.    );.
c460: 0a 20 20 20 20 69 66 28 20 72 65 73 3c 3d 30 20  .    if( res<=0 
c470: 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70  ){.      *pp = p
c480: 31 3b 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70  1;.      pp = &p
c490: 31 2d 3e 75 2e 70 4e 65 78 74 3b 0a 20 20 20 20  1->u.pNext;.    
c4a0: 20 20 70 31 20 3d 20 70 31 2d 3e 75 2e 70 4e 65    p1 = p1->u.pNe
c4b0: 78 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 31  xt;.      if( p1
c4c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
c4d0: 70 70 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 20  pp = p2;.       
c4e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
c4f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c500: 20 2a 70 70 20 3d 20 70 32 3b 0a 20 20 20 20 20   *pp = p2;.     
c510: 20 70 70 20 3d 20 26 70 32 2d 3e 75 2e 70 4e 65   pp = &p2->u.pNe
c520: 78 74 3b 0a 20 20 20 20 20 20 70 32 20 3d 20 70  xt;.      p2 = p
c530: 32 2d 3e 75 2e 70 4e 65 78 74 3b 0a 20 20 20 20  2->u.pNext;.    
c540: 20 20 62 43 61 63 68 65 64 20 3d 20 30 3b 0a 20    bCached = 0;. 
c550: 20 20 20 20 20 69 66 28 20 70 32 3d 3d 30 20 29       if( p2==0 )
c560: 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20  {.        *pp = 
c570: 70 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  p1;.        brea
c580: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
c590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 46  .  }.  return pF
c5a0: 69 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  inal;.}../*.** R
c5b0: 65 74 75 72 6e 20 74 68 65 20 53 6f 72 74 65 72  eturn the Sorter
c5c0: 43 6f 6d 70 61 72 65 20 66 75 6e 63 74 69 6f 6e  Compare function
c5d0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 76 61 6c 75   to compare valu
c5e0: 65 73 20 63 6f 6c 6c 65 63 74 65 64 20 62 79 20  es collected by 
c5f0: 74 68 65 0a 2a 2a 20 73 6f 72 74 65 72 20 6f 62  the.** sorter ob
c600: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
c610: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
c620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 6f 72 74  ..*/.static Sort
c630: 65 72 43 6f 6d 70 61 72 65 20 76 64 62 65 53 6f  erCompare vdbeSo
c640: 72 74 65 72 47 65 74 43 6f 6d 70 61 72 65 28 56  rterGetCompare(V
c650: 64 62 65 53 6f 72 74 65 72 20 2a 70 29 7b 0a 20  dbeSorter *p){. 
c660: 20 69 66 28 20 70 2d 3e 74 79 70 65 4d 61 73 6b   if( p->typeMask
c670: 3d 3d 53 4f 52 54 45 52 5f 54 59 50 45 5f 49 4e  ==SORTER_TYPE_IN
c680: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 72 65 74  TEGER ){.    ret
c690: 75 72 6e 20 76 64 62 65 53 6f 72 74 65 72 43 6f  urn vdbeSorterCo
c6a0: 6d 70 61 72 65 49 6e 74 3b 0a 20 20 7d 65 6c 73  mpareInt;.  }els
c6b0: 65 20 69 66 28 20 70 2d 3e 74 79 70 65 4d 61 73  e if( p->typeMas
c6c0: 6b 3d 3d 53 4f 52 54 45 52 5f 54 59 50 45 5f 54  k==SORTER_TYPE_T
c6d0: 45 58 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  EXT ){.    retur
c6e0: 6e 20 76 64 62 65 53 6f 72 74 65 72 43 6f 6d 70  n vdbeSorterComp
c6f0: 61 72 65 54 65 78 74 3b 20 0a 20 20 7d 0a 20 20  areText; .  }.  
c700: 72 65 74 75 72 6e 20 76 64 62 65 53 6f 72 74 65  return vdbeSorte
c710: 72 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a  rCompare;.}../*.
c720: 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 6e 6b  ** Sort the link
c730: 65 64 20 6c 69 73 74 20 6f 66 20 72 65 63 6f 72  ed list of recor
c740: 64 73 20 68 65 61 64 65 64 20 61 74 20 70 54 61  ds headed at pTa
c750: 73 6b 2d 3e 70 4c 69 73 74 2e 20 52 65 74 75 72  sk->pList. Retur
c760: 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  n .** SQLITE_OK 
c770: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
c780: 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
c790: 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 53 51 4c  r code (i.e. SQL
c7a0: 49 54 45 5f 4e 4f 4d 45 4d 29 20 69 66 20 0a 2a  ITE_NOMEM) if .*
c7b0: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
c7c0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
c7d0: 20 76 64 62 65 53 6f 72 74 65 72 53 6f 72 74 28   vdbeSorterSort(
c7e0: 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61  SortSubtask *pTa
c7f0: 73 6b 2c 20 53 6f 72 74 65 72 4c 69 73 74 20 2a  sk, SorterList *
c800: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
c810: 0a 20 20 53 6f 72 74 65 72 52 65 63 6f 72 64 20  .  SorterRecord 
c820: 2a 2a 61 53 6c 6f 74 3b 0a 20 20 53 6f 72 74 65  **aSlot;.  Sorte
c830: 72 52 65 63 6f 72 64 20 2a 70 3b 0a 20 20 69 6e  rRecord *p;.  in
c840: 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 76 64  t rc;..  rc = vd
c850: 62 65 53 6f 72 74 41 6c 6c 6f 63 55 6e 70 61 63  beSortAllocUnpac
c860: 6b 65 64 28 70 54 61 73 6b 29 3b 0a 20 20 69 66  ked(pTask);.  if
c870: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c880: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
c890: 70 20 3d 20 70 4c 69 73 74 2d 3e 70 4c 69 73 74  p = pList->pList
c8a0: 3b 0a 20 20 70 54 61 73 6b 2d 3e 78 43 6f 6d 70  ;.  pTask->xComp
c8b0: 61 72 65 20 3d 20 76 64 62 65 53 6f 72 74 65 72  are = vdbeSorter
c8c0: 47 65 74 43 6f 6d 70 61 72 65 28 70 54 61 73 6b  GetCompare(pTask
c8d0: 2d 3e 70 53 6f 72 74 65 72 29 3b 0a 0a 20 20 61  ->pSorter);..  a
c8e0: 53 6c 6f 74 20 3d 20 28 53 6f 72 74 65 72 52 65  Slot = (SorterRe
c8f0: 63 6f 72 64 20 2a 2a 29 73 71 6c 69 74 65 33 4d  cord **)sqlite3M
c900: 61 6c 6c 6f 63 5a 65 72 6f 28 36 34 20 2a 20 73  allocZero(64 * s
c910: 69 7a 65 6f 66 28 53 6f 72 74 65 72 52 65 63 6f  izeof(SorterReco
c920: 72 64 20 2a 29 29 3b 0a 20 20 69 66 28 20 21 61  rd *));.  if( !a
c930: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 72 65 74 75  Slot ){.    retu
c940: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
c950: 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  BKPT;.  }..  whi
c960: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 6f 72  le( p ){.    Sor
c970: 74 65 72 52 65 63 6f 72 64 20 2a 70 4e 65 78 74  terRecord *pNext
c980: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
c990: 3e 61 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  >aMemory ){.    
c9a0: 20 20 69 66 28 20 28 75 38 2a 29 70 3d 3d 70 4c    if( (u8*)p==pL
c9b0: 69 73 74 2d 3e 61 4d 65 6d 6f 72 79 20 29 7b 0a  ist->aMemory ){.
c9c0: 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
c9d0: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
c9e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c9f0: 70 2d 3e 75 2e 69 4e 65 78 74 3c 73 71 6c 69 74  p->u.iNext<sqlit
ca00: 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 4c 69  e3MallocSize(pLi
ca10: 73 74 2d 3e 61 4d 65 6d 6f 72 79 29 20 29 3b 0a  st->aMemory) );.
ca20: 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
ca30: 28 53 6f 72 74 65 72 52 65 63 6f 72 64 2a 29 26  (SorterRecord*)&
ca40: 70 4c 69 73 74 2d 3e 61 4d 65 6d 6f 72 79 5b 70  pList->aMemory[p
ca50: 2d 3e 75 2e 69 4e 65 78 74 5d 3b 0a 20 20 20 20  ->u.iNext];.    
ca60: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
ca70: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e       pNext = p->
ca80: 75 2e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a  u.pNext;.    }..
ca90: 20 20 20 20 70 2d 3e 75 2e 70 4e 65 78 74 20 3d      p->u.pNext =
caa0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
cab0: 20 61 53 6c 6f 74 5b 69 5d 3b 20 69 2b 2b 29 7b   aSlot[i]; i++){
cac0: 0a 20 20 20 20 20 20 70 20 3d 20 76 64 62 65 53  .      p = vdbeS
cad0: 6f 72 74 65 72 4d 65 72 67 65 28 70 54 61 73 6b  orterMerge(pTask
cae0: 2c 20 70 2c 20 61 53 6c 6f 74 5b 69 5d 29 3b 0a  , p, aSlot[i]);.
caf0: 20 20 20 20 20 20 61 53 6c 6f 74 5b 69 5d 20 3d        aSlot[i] =
cb00: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53   0;.    }.    aS
cb10: 6c 6f 74 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20  lot[i] = p;.    
cb20: 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a  p = pNext;.  }..
cb30: 20 20 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    p = 0;.  for(i
cb40: 3d 30 3b 20 69 3c 36 34 3b 20 69 2b 2b 29 7b 0a  =0; i<64; i++){.
cb50: 20 20 20 20 69 66 28 20 61 53 6c 6f 74 5b 69 5d      if( aSlot[i]
cb60: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
cb70: 20 20 20 20 70 20 3d 20 70 20 3f 20 76 64 62 65      p = p ? vdbe
cb80: 53 6f 72 74 65 72 4d 65 72 67 65 28 70 54 61 73  SorterMerge(pTas
cb90: 6b 2c 20 70 2c 20 61 53 6c 6f 74 5b 69 5d 29 20  k, p, aSlot[i]) 
cba0: 3a 20 61 53 6c 6f 74 5b 69 5d 3b 0a 20 20 7d 0a  : aSlot[i];.  }.
cbb0: 20 20 70 4c 69 73 74 2d 3e 70 4c 69 73 74 20 3d    pList->pList =
cbc0: 20 70 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66   p;..  sqlite3_f
cbd0: 72 65 65 28 61 53 6c 6f 74 29 3b 0a 20 20 61 73  ree(aSlot);.  as
cbe0: 73 65 72 74 28 20 70 54 61 73 6b 2d 3e 70 55 6e  sert( pTask->pUn
cbf0: 70 61 63 6b 65 64 2d 3e 65 72 72 43 6f 64 65 3d  packed->errCode=
cc00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20  =SQLITE_OK .    
cc10: 20 20 20 7c 7c 20 70 54 61 73 6b 2d 3e 70 55 6e     || pTask->pUn
cc20: 70 61 63 6b 65 64 2d 3e 65 72 72 43 6f 64 65 3d  packed->errCode=
cc30: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 20  =SQLITE_NOMEM . 
cc40: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61   );.  return pTa
cc50: 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 2d 3e 65  sk->pUnpacked->e
cc60: 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrCode;.}../*.**
cc70: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 50 4d   Initialize a PM
cc80: 41 2d 77 72 69 74 65 72 20 6f 62 6a 65 63 74 2e  A-writer object.
cc90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cca0: 76 64 62 65 50 6d 61 57 72 69 74 65 72 49 6e 69  vdbePmaWriterIni
ccb0: 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  t(.  sqlite3_fil
ccc0: 65 20 2a 70 46 64 2c 20 20 20 20 20 20 20 20 20  e *pFd,         
ccd0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e       /* File han
cce0: 64 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20  dle to write to 
ccf0: 2a 2f 0a 20 20 50 6d 61 57 72 69 74 65 72 20 2a  */.  PmaWriter *
cd00: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
cd10: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74       /* Object t
cd20: 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 20 20  o populate */.  
cd30: 69 6e 74 20 6e 42 75 66 2c 20 20 20 20 20 20 20  int nBuf,       
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd50: 2f 2a 20 42 75 66 66 65 72 20 73 69 7a 65 20 2a  /* Buffer size *
cd60: 2f 0a 20 20 69 36 34 20 69 53 74 61 72 74 20 20  /.  i64 iStart  
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
cd90: 20 70 46 64 20 74 6f 20 62 65 67 69 6e 20 77 72   pFd to begin wr
cda0: 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20  iting at */.){. 
cdb0: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
cdc0: 7a 65 6f 66 28 50 6d 61 57 72 69 74 65 72 29 29  zeof(PmaWriter))
cdd0: 3b 0a 20 20 70 2d 3e 61 42 75 66 66 65 72 20 3d  ;.  p->aBuffer =
cde0: 20 28 75 38 2a 29 73 71 6c 69 74 65 33 4d 61 6c   (u8*)sqlite3Mal
cdf0: 6c 6f 63 28 6e 42 75 66 29 3b 0a 20 20 69 66 28  loc(nBuf);.  if(
ce00: 20 21 70 2d 3e 61 42 75 66 66 65 72 20 29 7b 0a   !p->aBuffer ){.
ce10: 20 20 20 20 70 2d 3e 65 46 57 45 72 72 20 3d 20      p->eFWErr = 
ce20: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
ce30: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
ce40: 70 2d 3e 69 42 75 66 45 6e 64 20 3d 20 70 2d 3e  p->iBufEnd = p->
ce50: 69 42 75 66 53 74 61 72 74 20 3d 20 28 69 53 74  iBufStart = (iSt
ce60: 61 72 74 20 25 20 6e 42 75 66 29 3b 0a 20 20 20  art % nBuf);.   
ce70: 20 70 2d 3e 69 57 72 69 74 65 4f 66 66 20 3d 20   p->iWriteOff = 
ce80: 69 53 74 61 72 74 20 2d 20 70 2d 3e 69 42 75 66  iStart - p->iBuf
ce90: 53 74 61 72 74 3b 0a 20 20 20 20 70 2d 3e 6e 42  Start;.    p->nB
cea0: 75 66 66 65 72 20 3d 20 6e 42 75 66 3b 0a 20 20  uffer = nBuf;.  
ceb0: 20 20 70 2d 3e 70 46 64 20 3d 20 70 46 64 3b 0a    p->pFd = pFd;.
cec0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69    }.}../*.** Wri
ced0: 74 65 20 6e 44 61 74 61 20 62 79 74 65 73 20 6f  te nData bytes o
cee0: 66 20 64 61 74 61 20 74 6f 20 74 68 65 20 50 4d  f data to the PM
cef0: 41 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  A. Return SQLITE
cf00: 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73  _OK.** if succes
cf10: 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
cf20: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  te error code if
cf30: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
cf40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
cf50: 20 76 64 62 65 50 6d 61 57 72 69 74 65 42 6c 6f   vdbePmaWriteBlo
cf60: 62 28 50 6d 61 57 72 69 74 65 72 20 2a 70 2c 20  b(PmaWriter *p, 
cf70: 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  u8 *pData, int n
cf80: 44 61 74 61 29 7b 0a 20 20 69 6e 74 20 6e 52 65  Data){.  int nRe
cf90: 6d 20 3d 20 6e 44 61 74 61 3b 0a 20 20 77 68 69  m = nData;.  whi
cfa0: 6c 65 28 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d  le( nRem>0 && p-
cfb0: 3e 65 46 57 45 72 72 3d 3d 30 20 29 7b 0a 20 20  >eFWErr==0 ){.  
cfc0: 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 6e 52    int nCopy = nR
cfd0: 65 6d 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 70  em;.    if( nCop
cfe0: 79 3e 28 70 2d 3e 6e 42 75 66 66 65 72 20 2d 20  y>(p->nBuffer - 
cff0: 70 2d 3e 69 42 75 66 45 6e 64 29 20 29 7b 0a 20  p->iBufEnd) ){. 
d000: 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 70 2d 3e       nCopy = p->
d010: 6e 42 75 66 66 65 72 20 2d 20 70 2d 3e 69 42 75  nBuffer - p->iBu
d020: 66 45 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  fEnd;.    }..   
d030: 20 6d 65 6d 63 70 79 28 26 70 2d 3e 61 42 75 66   memcpy(&p->aBuf
d040: 66 65 72 5b 70 2d 3e 69 42 75 66 45 6e 64 5d 2c  fer[p->iBufEnd],
d050: 20 26 70 44 61 74 61 5b 6e 44 61 74 61 2d 6e 52   &pData[nData-nR
d060: 65 6d 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  em], nCopy);.   
d070: 20 70 2d 3e 69 42 75 66 45 6e 64 20 2b 3d 20 6e   p->iBufEnd += n
d080: 43 6f 70 79 3b 0a 20 20 20 20 69 66 28 20 70 2d  Copy;.    if( p-
d090: 3e 69 42 75 66 45 6e 64 3d 3d 70 2d 3e 6e 42 75  >iBufEnd==p->nBu
d0a0: 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 70 2d  ffer ){.      p-
d0b0: 3e 65 46 57 45 72 72 20 3d 20 73 71 6c 69 74 65  >eFWErr = sqlite
d0c0: 33 4f 73 57 72 69 74 65 28 70 2d 3e 70 46 64 2c  3OsWrite(p->pFd,
d0d0: 20 0a 20 20 20 20 20 20 20 20 20 20 26 70 2d 3e   .          &p->
d0e0: 61 42 75 66 66 65 72 5b 70 2d 3e 69 42 75 66 53  aBuffer[p->iBufS
d0f0: 74 61 72 74 5d 2c 20 70 2d 3e 69 42 75 66 45 6e  tart], p->iBufEn
d100: 64 20 2d 20 70 2d 3e 69 42 75 66 53 74 61 72 74  d - p->iBufStart
d110: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  , .          p->
d120: 69 57 72 69 74 65 4f 66 66 20 2b 20 70 2d 3e 69  iWriteOff + p->i
d130: 42 75 66 53 74 61 72 74 0a 20 20 20 20 20 20 29  BufStart.      )
d140: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 42 75 66 53  ;.      p->iBufS
d150: 74 61 72 74 20 3d 20 70 2d 3e 69 42 75 66 45 6e  tart = p->iBufEn
d160: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  d = 0;.      p->
d170: 69 57 72 69 74 65 4f 66 66 20 2b 3d 20 70 2d 3e  iWriteOff += p->
d180: 6e 42 75 66 66 65 72 3b 0a 20 20 20 20 7d 0a 20  nBuffer;.    }. 
d190: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 42     assert( p->iB
d1a0: 75 66 45 6e 64 3c 70 2d 3e 6e 42 75 66 66 65 72  ufEnd<p->nBuffer
d1b0: 20 29 3b 0a 0a 20 20 20 20 6e 52 65 6d 20 2d 3d   );..    nRem -=
d1c0: 20 6e 43 6f 70 79 3b 0a 20 20 7d 0a 7d 0a 0a 2f   nCopy;.  }.}../
d1d0: 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 62  *.** Flush any b
d1e0: 75 66 66 65 72 65 64 20 64 61 74 61 20 74 6f 20  uffered data to 
d1f0: 64 69 73 6b 20 61 6e 64 20 63 6c 65 61 6e 20 75  disk and clean u
d200: 70 20 74 68 65 20 50 4d 41 2d 77 72 69 74 65 72  p the PMA-writer
d210: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 54 68 65 20   object..** The 
d220: 72 65 73 75 6c 74 73 20 6f 66 20 75 73 69 6e 67  results of using
d230: 20 74 68 65 20 50 4d 41 2d 77 72 69 74 65 72 20   the PMA-writer 
d240: 61 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20  after this call 
d250: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  are undefined..*
d260: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
d270: 4f 4b 20 69 66 20 66 6c 75 73 68 69 6e 67 20 74  OK if flushing t
d280: 68 65 20 62 75 66 66 65 72 65 64 20 64 61 74 61  he buffered data
d290: 20 73 75 63 63 65 65 64 73 20 6f 72 20 69 73 20   succeeds or is 
d2a0: 6e 6f 74 20 0a 2a 2a 20 72 65 71 75 69 72 65 64  not .** required
d2b0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
d2c0: 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
d2d0: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
d2e0: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
d2f0: 2c 20 73 65 74 20 2a 70 69 45 6f 66 20 74 6f 20  , set *piEof to 
d300: 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65 64  the offset immed
d310: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
d320: 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 62 79 74   the.** last byt
d330: 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
d340: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
d350: 20 69 6e 74 20 76 64 62 65 50 6d 61 57 72 69 74   int vdbePmaWrit
d360: 65 72 46 69 6e 69 73 68 28 50 6d 61 57 72 69 74  erFinish(PmaWrit
d370: 65 72 20 2a 70 2c 20 69 36 34 20 2a 70 69 45 6f  er *p, i64 *piEo
d380: 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  f){.  int rc;.  
d390: 69 66 28 20 70 2d 3e 65 46 57 45 72 72 3d 3d 30  if( p->eFWErr==0
d3a0: 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 61 42   && ALWAYS(p->aB
d3b0: 75 66 66 65 72 29 20 26 26 20 70 2d 3e 69 42 75  uffer) && p->iBu
d3c0: 66 45 6e 64 3e 70 2d 3e 69 42 75 66 53 74 61 72  fEnd>p->iBufStar
d3d0: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 65 46 57 45  t ){.    p->eFWE
d3e0: 72 72 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rr = sqlite3OsWr
d3f0: 69 74 65 28 70 2d 3e 70 46 64 2c 20 0a 20 20 20  ite(p->pFd, .   
d400: 20 20 20 20 20 26 70 2d 3e 61 42 75 66 66 65 72       &p->aBuffer
d410: 5b 70 2d 3e 69 42 75 66 53 74 61 72 74 5d 2c 20  [p->iBufStart], 
d420: 70 2d 3e 69 42 75 66 45 6e 64 20 2d 20 70 2d 3e  p->iBufEnd - p->
d430: 69 42 75 66 53 74 61 72 74 2c 20 0a 20 20 20 20  iBufStart, .    
d440: 20 20 20 20 70 2d 3e 69 57 72 69 74 65 4f 66 66      p->iWriteOff
d450: 20 2b 20 70 2d 3e 69 42 75 66 53 74 61 72 74 0a   + p->iBufStart.
d460: 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 2a 70 69      );.  }.  *pi
d470: 45 6f 66 20 3d 20 28 70 2d 3e 69 57 72 69 74 65  Eof = (p->iWrite
d480: 4f 66 66 20 2b 20 70 2d 3e 69 42 75 66 45 6e 64  Off + p->iBufEnd
d490: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
d4a0: 65 28 70 2d 3e 61 42 75 66 66 65 72 29 3b 0a 20  e(p->aBuffer);. 
d4b0: 20 72 63 20 3d 20 70 2d 3e 65 46 57 45 72 72 3b   rc = p->eFWErr;
d4c0: 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
d4d0: 73 69 7a 65 6f 66 28 50 6d 61 57 72 69 74 65 72  sizeof(PmaWriter
d4e0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
d4f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
d500: 76 61 6c 75 65 20 69 56 61 6c 20 65 6e 63 6f 64  value iVal encod
d510: 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 20 74  ed as a varint t
d520: 6f 20 74 68 65 20 50 4d 41 2e 20 52 65 74 75 72  o the PMA. Retur
d530: 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  n .** SQLITE_OK 
d540: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
d550: 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
d560: 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72  r code if an err
d570: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
d580: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 50 6d  atic void vdbePm
d590: 61 57 72 69 74 65 56 61 72 69 6e 74 28 50 6d 61  aWriteVarint(Pma
d5a0: 57 72 69 74 65 72 20 2a 70 2c 20 75 36 34 20 69  Writer *p, u64 i
d5b0: 56 61 6c 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  Val){.  int nByt
d5c0: 65 3b 20 0a 20 20 75 38 20 61 42 79 74 65 5b 31  e; .  u8 aByte[1
d5d0: 30 5d 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 71  0];.  nByte = sq
d5e0: 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74 28 61  lite3PutVarint(a
d5f0: 42 79 74 65 2c 20 69 56 61 6c 29 3b 0a 20 20 76  Byte, iVal);.  v
d600: 64 62 65 50 6d 61 57 72 69 74 65 42 6c 6f 62 28  dbePmaWriteBlob(
d610: 70 2c 20 61 42 79 74 65 2c 20 6e 42 79 74 65 29  p, aByte, nByte)
d620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
d630: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
d640: 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f  tents of in-memo
d650: 72 79 20 6c 69 6e 6b 65 64 2d 6c 69 73 74 20 70  ry linked-list p
d660: 4c 69 73 74 20 74 6f 20 61 20 6c 65 76 65 6c 2d  List to a level-
d670: 30 0a 2a 2a 20 50 4d 41 20 69 6e 20 74 68 65 20  0.** PMA in the 
d680: 74 65 6d 70 20 66 69 6c 65 20 62 65 6c 6f 6e 67  temp file belong
d690: 69 6e 67 20 74 6f 20 73 75 62 2d 74 61 73 6b 20  ing to sub-task 
d6a0: 70 54 61 73 6b 2e 20 52 65 74 75 72 6e 20 53 51  pTask. Return SQ
d6b0: 4c 49 54 45 5f 4f 4b 20 69 66 20 0a 2a 2a 20 73  LITE_OK if .** s
d6c0: 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
d6d0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
d6e0: 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  de otherwise..**
d6f0: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 6f  .** The format o
d700: 66 20 61 20 50 4d 41 20 69 73 3a 0a 2a 2a 0a 2a  f a PMA is:.**.*
d710: 2a 20 20 20 20 20 2a 20 41 20 76 61 72 69 6e 74  *     * A varint
d720: 2e 20 54 68 69 73 20 76 61 72 69 6e 74 20 63 6f  . This varint co
d730: 6e 74 61 69 6e 73 20 74 68 65 20 74 6f 74 61 6c  ntains the total
d740: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
d750: 20 6f 66 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 20   of content.**  
d760: 20 20 20 20 20 69 6e 20 74 68 65 20 50 4d 41 20       in the PMA 
d770: 28 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 74  (not including t
d780: 68 65 20 76 61 72 69 6e 74 20 69 74 73 65 6c 66  he varint itself
d790: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 4f  )..**.**     * O
d7a0: 6e 65 20 6f 72 20 6d 6f 72 65 20 72 65 63 6f 72  ne or more recor
d7b0: 64 73 20 70 61 63 6b 65 64 20 65 6e 64 2d 74 6f  ds packed end-to
d7c0: 2d 65 6e 64 20 69 6e 20 6f 72 64 65 72 20 6f 66  -end in order of
d7d0: 20 61 73 63 65 6e 64 69 6e 67 20 6b 65 79 73 2e   ascending keys.
d7e0: 20 0a 2a 2a 20 20 20 20 20 20 20 45 61 63 68 20   .**       Each 
d7f0: 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74 73 20  record consists 
d800: 6f 66 20 61 20 76 61 72 69 6e 74 20 66 6f 6c 6c  of a varint foll
d810: 6f 77 65 64 20 62 79 20 61 20 62 6c 6f 62 20 6f  owed by a blob o
d820: 66 20 64 61 74 61 20 28 74 68 65 20 0a 2a 2a 20  f data (the .** 
d830: 20 20 20 20 20 20 6b 65 79 29 2e 20 54 68 65 20        key). The 
d840: 76 61 72 69 6e 74 20 69 73 20 74 68 65 20 6e 75  varint is the nu
d850: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
d860: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
d870: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  a..*/.static int
d880: 20 76 64 62 65 53 6f 72 74 65 72 4c 69 73 74 54   vdbeSorterListT
d890: 6f 50 4d 41 28 53 6f 72 74 53 75 62 74 61 73 6b  oPMA(SortSubtask
d8a0: 20 2a 70 54 61 73 6b 2c 20 53 6f 72 74 65 72 4c   *pTask, SorterL
d8b0: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73  ist *pList){.  s
d8c0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 54 61  qlite3 *db = pTa
d8d0: 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 64 62 3b  sk->pSorter->db;
d8e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
d8f0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
d900: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
d910: 65 20 2a 2f 0a 20 20 50 6d 61 57 72 69 74 65 72  e */.  PmaWriter
d920: 20 77 72 69 74 65 72 3b 20 20 20 20 20 20 20 20   writer;        
d930: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
d940: 20 75 73 65 64 20 74 6f 20 77 72 69 74 65 20 74   used to write t
d950: 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 0a 23  o the file */..#
d960: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
d970: 55 47 0a 20 20 2f 2a 20 53 65 74 20 69 53 7a 20  UG.  /* Set iSz 
d980: 74 6f 20 74 68 65 20 65 78 70 65 63 74 65 64 20  to the expected 
d990: 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 54 61  size of file pTa
d9a0: 73 6b 2d 3e 66 69 6c 65 20 61 66 74 65 72 20 77  sk->file after w
d9b0: 72 69 74 69 6e 67 20 74 68 65 20 50 4d 41 2e 20  riting the PMA. 
d9c0: 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73  .  ** This is us
d9d0: 65 64 20 62 79 20 61 6e 20 61 73 73 65 72 74 28  ed by an assert(
d9e0: 29 20 73 74 61 74 65 6d 65 6e 74 20 61 74 20 74  ) statement at t
d9f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 66  he end of this f
da00: 75 6e 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 69  unction.  */.  i
da10: 36 34 20 69 53 7a 20 3d 20 70 4c 69 73 74 2d 3e  64 iSz = pList->
da20: 73 7a 50 4d 41 20 2b 20 73 71 6c 69 74 65 33 56  szPMA + sqlite3V
da30: 61 72 69 6e 74 4c 65 6e 28 70 4c 69 73 74 2d 3e  arintLen(pList->
da40: 73 7a 50 4d 41 29 20 2b 20 70 54 61 73 6b 2d 3e  szPMA) + pTask->
da50: 66 69 6c 65 2e 69 45 6f 66 3b 0a 23 65 6e 64 69  file.iEof;.#endi
da60: 66 0a 0a 20 20 76 64 62 65 53 6f 72 74 65 72 57  f..  vdbeSorterW
da70: 6f 72 6b 44 65 62 75 67 28 70 54 61 73 6b 2c 20  orkDebug(pTask, 
da80: 22 65 6e 74 65 72 22 29 3b 0a 20 20 6d 65 6d 73  "enter");.  mems
da90: 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73  et(&writer, 0, s
daa0: 69 7a 65 6f 66 28 50 6d 61 57 72 69 74 65 72 29  izeof(PmaWriter)
dab0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  );.  assert( pLi
dac0: 73 74 2d 3e 73 7a 50 4d 41 3e 30 20 29 3b 0a 0a  st->szPMA>0 );..
dad0: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 72 73    /* If the firs
dae0: 74 20 74 65 6d 70 6f 72 61 72 79 20 50 4d 41 20  t temporary PMA 
daf0: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
db00: 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
db10: 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  t now. */.  if( 
db20: 70 54 61 73 6b 2d 3e 66 69 6c 65 2e 70 46 64 3d  pTask->file.pFd=
db30: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 76  =0 ){.    rc = v
db40: 64 62 65 53 6f 72 74 65 72 4f 70 65 6e 54 65 6d  dbeSorterOpenTem
db50: 70 46 69 6c 65 28 64 62 2c 20 30 2c 20 26 70 54  pFile(db, 0, &pT
db60: 61 73 6b 2d 3e 66 69 6c 65 2e 70 46 64 29 3b 0a  ask->file.pFd);.
db70: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
db80: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 54 61  SQLITE_OK || pTa
db90: 73 6b 2d 3e 66 69 6c 65 2e 70 46 64 20 29 3b 0a  sk->file.pFd );.
dba0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 73      assert( pTas
dbb0: 6b 2d 3e 66 69 6c 65 2e 69 45 6f 66 3d 3d 30 20  k->file.iEof==0 
dbc0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
dbd0: 54 61 73 6b 2d 3e 6e 50 4d 41 3d 3d 30 20 29 3b  Task->nPMA==0 );
dbe0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 72 79 20 74  .  }..  /* Try t
dbf0: 6f 20 67 65 74 20 74 68 65 20 66 69 6c 65 20 74  o get the file t
dc00: 6f 20 6d 65 6d 6f 72 79 20 6d 61 70 20 2a 2f 0a  o memory map */.
dc10: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dc20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 64 62 65 53  _OK ){.    vdbeS
dc30: 6f 72 74 65 72 45 78 74 65 6e 64 46 69 6c 65 28  orterExtendFile(
dc40: 64 62 2c 20 70 54 61 73 6b 2d 3e 66 69 6c 65 2e  db, pTask->file.
dc50: 70 46 64 2c 20 70 54 61 73 6b 2d 3e 66 69 6c 65  pFd, pTask->file
dc60: 2e 69 45 6f 66 2b 70 4c 69 73 74 2d 3e 73 7a 50  .iEof+pList->szP
dc70: 4d 41 2b 39 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  MA+9);.  }..  /*
dc80: 20 53 6f 72 74 20 74 68 65 20 6c 69 73 74 20 2a   Sort the list *
dc90: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
dca0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
dcb0: 3d 20 76 64 62 65 53 6f 72 74 65 72 53 6f 72 74  = vdbeSorterSort
dcc0: 28 70 54 61 73 6b 2c 20 70 4c 69 73 74 29 3b 0a  (pTask, pList);.
dcd0: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
dce0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
dcf0: 53 6f 72 74 65 72 52 65 63 6f 72 64 20 2a 70 3b  SorterRecord *p;
dd00: 0a 20 20 20 20 53 6f 72 74 65 72 52 65 63 6f 72  .    SorterRecor
dd10: 64 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20  d *pNext = 0;.. 
dd20: 20 20 20 76 64 62 65 50 6d 61 57 72 69 74 65 72     vdbePmaWriter
dd30: 49 6e 69 74 28 70 54 61 73 6b 2d 3e 66 69 6c 65  Init(pTask->file
dd40: 2e 70 46 64 2c 20 26 77 72 69 74 65 72 2c 20 70  .pFd, &writer, p
dd50: 54 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 70  Task->pSorter->p
dd60: 67 73 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gsz,.           
dd70: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 73 6b             pTask
dd80: 2d 3e 66 69 6c 65 2e 69 45 6f 66 29 3b 0a 20 20  ->file.iEof);.  
dd90: 20 20 70 54 61 73 6b 2d 3e 6e 50 4d 41 2b 2b 3b    pTask->nPMA++;
dda0: 0a 20 20 20 20 76 64 62 65 50 6d 61 57 72 69 74  .    vdbePmaWrit
ddb0: 65 56 61 72 69 6e 74 28 26 77 72 69 74 65 72 2c  eVarint(&writer,
ddc0: 20 70 4c 69 73 74 2d 3e 73 7a 50 4d 41 29 3b 0a   pList->szPMA);.
ddd0: 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 2d      for(p=pList-
dde0: 3e 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65  >pList; p; p=pNe
ddf0: 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74  xt){.      pNext
de00: 20 3d 20 70 2d 3e 75 2e 70 4e 65 78 74 3b 0a 20   = p->u.pNext;. 
de10: 20 20 20 20 20 76 64 62 65 50 6d 61 57 72 69 74       vdbePmaWrit
de20: 65 56 61 72 69 6e 74 28 26 77 72 69 74 65 72 2c  eVarint(&writer,
de30: 20 70 2d 3e 6e 56 61 6c 29 3b 0a 20 20 20 20 20   p->nVal);.     
de40: 20 76 64 62 65 50 6d 61 57 72 69 74 65 42 6c 6f   vdbePmaWriteBlo
de50: 62 28 26 77 72 69 74 65 72 2c 20 53 52 56 41 4c  b(&writer, SRVAL
de60: 28 70 29 2c 20 70 2d 3e 6e 56 61 6c 29 3b 0a 20  (p), p->nVal);. 
de70: 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
de80: 61 4d 65 6d 6f 72 79 3d 3d 30 20 29 20 73 71 6c  aMemory==0 ) sql
de90: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
dea0: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70    }.    pList->p
deb0: 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 72 63  List = p;.    rc
dec0: 20 3d 20 76 64 62 65 50 6d 61 57 72 69 74 65 72   = vdbePmaWriter
ded0: 46 69 6e 69 73 68 28 26 77 72 69 74 65 72 2c 20  Finish(&writer, 
dee0: 26 70 54 61 73 6b 2d 3e 66 69 6c 65 2e 69 45 6f  &pTask->file.iEo
def0: 66 29 3b 0a 20 20 7d 0a 0a 20 20 76 64 62 65 53  f);.  }..  vdbeS
df00: 6f 72 74 65 72 57 6f 72 6b 44 65 62 75 67 28 70  orterWorkDebug(p
df10: 54 61 73 6b 2c 20 22 65 78 69 74 22 29 3b 0a 20  Task, "exit");. 
df20: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
df30: 49 54 45 5f 4f 4b 20 7c 7c 20 70 4c 69 73 74 2d  ITE_OK || pList-
df40: 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 61  >pList==0 );.  a
df50: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
df60: 45 5f 4f 4b 20 7c 7c 20 70 54 61 73 6b 2d 3e 66  E_OK || pTask->f
df70: 69 6c 65 2e 69 45 6f 66 3d 3d 69 53 7a 20 29 3b  ile.iEof==iSz );
df80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
df90: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
dfa0: 68 65 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 74  he MergeEngine t
dfb0: 6f 20 69 74 73 20 6e 65 78 74 20 65 6e 74 72 79  o its next entry
dfc0: 2e 0a 2a 2a 20 53 65 74 20 2a 70 62 45 6f 66 20  ..** Set *pbEof 
dfd0: 74 6f 20 74 72 75 65 20 74 68 65 72 65 20 69 73  to true there is
dfe0: 20 6e 6f 20 6e 65 78 74 20 65 6e 74 72 79 20 62   no next entry b
dff0: 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 4d 65  ecause.** the Me
e000: 72 67 65 45 6e 67 69 6e 65 20 68 61 73 20 72 65  rgeEngine has re
e010: 61 63 68 65 64 20 74 68 65 20 65 6e 64 20 6f 66  ached the end of
e020: 20 61 6c 6c 20 69 74 73 20 69 6e 70 75 74 73 2e   all its inputs.
e030: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
e040: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
e050: 73 73 66 75 6c 20 6f 72 20 61 6e 20 65 72 72 6f  ssful or an erro
e060: 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72  r code if an err
e070: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
e080: 61 74 69 63 20 69 6e 74 20 76 64 62 65 4d 65 72  atic int vdbeMer
e090: 67 65 45 6e 67 69 6e 65 53 74 65 70 28 0a 20 20  geEngineStep(.  
e0a0: 4d 65 72 67 65 45 6e 67 69 6e 65 20 2a 70 4d 65  MergeEngine *pMe
e0b0: 72 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  rger,      /* Th
e0c0: 65 20 6d 65 72 67 65 20 65 6e 67 69 6e 65 20 74  e merge engine t
e0d0: 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  o advance to the
e0e0: 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69   next row */.  i
e0f0: 6e 74 20 2a 70 62 45 6f 66 20 20 20 20 20 20 20  nt *pbEof       
e100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
e110: 20 54 52 55 45 20 61 74 20 45 4f 46 2e 20 20 53   TRUE at EOF.  S
e120: 65 74 20 66 61 6c 73 65 20 66 6f 72 20 6d 6f 72  et false for mor
e130: 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 29 7b 0a  e content */.){.
e140: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
e150: 69 50 72 65 76 20 3d 20 70 4d 65 72 67 65 72 2d  iPrev = pMerger-
e160: 3e 61 54 72 65 65 5b 31 5d 3b 2f 2a 20 49 6e 64  >aTree[1];/* Ind
e170: 65 78 20 6f 66 20 50 6d 61 52 65 61 64 65 72 20  ex of PmaReader 
e180: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
e190: 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61  SortSubtask *pTa
e1a0: 73 6b 20 3d 20 70 4d 65 72 67 65 72 2d 3e 70 54  sk = pMerger->pT
e1b0: 61 73 6b 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  ask;..  /* Advan
e1c0: 63 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 50  ce the current P
e1d0: 6d 61 52 65 61 64 65 72 20 2a 2f 0a 20 20 72 63  maReader */.  rc
e1e0: 20 3d 20 76 64 62 65 50 6d 61 52 65 61 64 65 72   = vdbePmaReader
e1f0: 4e 65 78 74 28 26 70 4d 65 72 67 65 72 2d 3e 61  Next(&pMerger->a
e200: 52 65 61 64 72 5b 69 50 72 65 76 5d 29 3b 0a 0a  Readr[iPrev]);..
e210: 20 20 2f 2a 20 55 70 64 61 74 65 20 63 6f 6e 74    /* Update cont
e220: 65 6e 74 73 20 6f 66 20 61 54 72 65 65 5b 5d 20  ents of aTree[] 
e230: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
e240: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
e250: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
e260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
e270: 65 78 20 6f 66 20 61 54 72 65 65 5b 5d 20 74 6f  ex of aTree[] to
e280: 20 72 65 63 61 6c 63 75 6c 61 74 65 20 2a 2f 0a   recalculate */.
e290: 20 20 20 20 50 6d 61 52 65 61 64 65 72 20 2a 70      PmaReader *p
e2a0: 52 65 61 64 72 31 3b 20 20 20 20 20 20 20 20 20  Readr1;         
e2b0: 2f 2a 20 46 69 72 73 74 20 50 6d 61 52 65 61 64  /* First PmaRead
e2c0: 65 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  er to compare */
e2d0: 0a 20 20 20 20 50 6d 61 52 65 61 64 65 72 20 2a  .    PmaReader *
e2e0: 70 52 65 61 64 72 32 3b 20 20 20 20 20 20 20 20  pReadr2;        
e2f0: 20 2f 2a 20 53 65 63 6f 6e 64 20 50 6d 61 52 65   /* Second PmaRe
e300: 61 64 65 72 20 74 6f 20 63 6f 6d 70 61 72 65 20  ader to compare 
e310: 2a 2f 0a 20 20 20 20 69 6e 74 20 62 43 61 63 68  */.    int bCach
e320: 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ed = 0;..    /* 
e330: 46 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 74  Find the first t
e340: 77 6f 20 50 6d 61 52 65 61 64 65 72 73 20 74 6f  wo PmaReaders to
e350: 20 63 6f 6d 70 61 72 65 2e 20 54 68 65 20 6f 6e   compare. The on
e360: 65 20 74 68 61 74 20 77 61 73 20 6a 75 73 74 0a  e that was just.
e370: 20 20 20 20 2a 2a 20 61 64 76 61 6e 63 65 64 20      ** advanced 
e380: 28 69 50 72 65 76 29 20 61 6e 64 20 74 68 65 20  (iPrev) and the 
e390: 6f 6e 65 20 6e 65 78 74 20 74 6f 20 69 74 20 69  one next to it i
e3a0: 6e 20 74 68 65 20 61 72 72 61 79 2e 20 20 2a 2f  n the array.  */
e3b0: 0a 20 20 20 20 70 52 65 61 64 72 31 20 3d 20 26  .    pReadr1 = &
e3c0: 70 4d 65 72 67 65 72 2d 3e 61 52 65 61 64 72 5b  pMerger->aReadr[
e3d0: 28 69 50 72 65 76 20 26 20 30 78 46 46 46 45 29  (iPrev & 0xFFFE)
e3e0: 5d 3b 0a 20 20 20 20 70 52 65 61 64 72 32 20 3d  ];.    pReadr2 =
e3f0: 20 26 70 4d 65 72 67 65 72 2d 3e 61 52 65 61 64   &pMerger->aRead
e400: 72 5b 28 69 50 72 65 76 20 7c 20 30 78 30 30 30  r[(iPrev | 0x000
e410: 31 29 5d 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  1)];..    for(i=
e420: 28 70 4d 65 72 67 65 72 2d 3e 6e 54 72 65 65 2b  (pMerger->nTree+
e430: 69 50 72 65 76 29 2f 32 3b 20 69 3e 30 3b 20 69  iPrev)/2; i>0; i
e440: 3d 69 2f 32 29 7b 0a 20 20 20 20 20 20 2f 2a 20  =i/2){.      /* 
e450: 43 6f 6d 70 61 72 65 20 70 52 65 61 64 72 31 20  Compare pReadr1 
e460: 61 6e 64 20 70 52 65 61 64 72 32 2e 20 53 74 6f  and pReadr2. Sto
e470: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
e480: 20 76 61 72 69 61 62 6c 65 20 69 52 65 73 2e 20   variable iRes. 
e490: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65  */.      int iRe
e4a0: 73 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  s;.      if( pRe
e4b0: 61 64 72 31 2d 3e 70 46 64 3d 3d 30 20 29 7b 0a  adr1->pFd==0 ){.
e4c0: 20 20 20 20 20 20 20 20 69 52 65 73 20 3d 20 2b          iRes = +
e4d0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
e4e0: 66 28 20 70 52 65 61 64 72 32 2d 3e 70 46 64 3d  f( pReadr2->pFd=
e4f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 52  =0 ){.        iR
e500: 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  es = -1;.      }
e510: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 52  else{.        iR
e520: 65 73 20 3d 20 70 54 61 73 6b 2d 3e 78 43 6f 6d  es = pTask->xCom
e530: 70 61 72 65 28 70 54 61 73 6b 2c 20 26 62 43 61  pare(pTask, &bCa
e540: 63 68 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ched,.          
e550: 20 20 70 52 65 61 64 72 31 2d 3e 61 4b 65 79 2c    pReadr1->aKey,
e560: 20 70 52 65 61 64 72 31 2d 3e 6e 4b 65 79 2c 20   pReadr1->nKey, 
e570: 70 52 65 61 64 72 32 2d 3e 61 4b 65 79 2c 20 70  pReadr2->aKey, p
e580: 52 65 61 64 72 32 2d 3e 6e 4b 65 79 0a 20 20 20  Readr2->nKey.   
e590: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
e5a0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 52 65  .      /* If pRe
e5b0: 61 64 72 31 20 63 6f 6e 74 61 69 6e 65 64 20 74  adr1 contained t
e5c0: 68 65 20 73 6d 61 6c 6c 65 72 20 76 61 6c 75 65  he smaller value
e5d0: 2c 20 73 65 74 20 61 54 72 65 65 5b 69 5d 20 74  , set aTree[i] t
e5e0: 6f 20 69 74 73 20 69 6e 64 65 78 2e 0a 20 20 20  o its index..   
e5f0: 20 20 20 2a 2a 20 54 68 65 6e 20 73 65 74 20 70     ** Then set p
e600: 52 65 61 64 72 32 20 74 6f 20 74 68 65 20 6e 65  Readr2 to the ne
e610: 78 74 20 50 6d 61 52 65 61 64 65 72 20 74 6f 20  xt PmaReader to 
e620: 63 6f 6d 70 61 72 65 20 74 6f 20 70 52 65 61 64  compare to pRead
e630: 72 31 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20  r1. In this.    
e640: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 72 65 20    ** case there 
e650: 69 73 20 6e 6f 20 63 61 63 68 65 20 6f 66 20 70  is no cache of p
e660: 52 65 61 64 72 32 20 69 6e 20 70 54 61 73 6b 2d  Readr2 in pTask-
e670: 3e 70 55 6e 70 61 63 6b 65 64 2c 20 73 6f 20 73  >pUnpacked, so s
e680: 65 74 0a 20 20 20 20 20 20 2a 2a 20 70 4b 65 79  et.      ** pKey
e690: 32 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  2 to point to th
e6a0: 65 20 72 65 63 6f 72 64 20 62 65 6c 6f 6e 67 69  e record belongi
e6b0: 6e 67 20 74 6f 20 70 52 65 61 64 72 32 2e 0a 20  ng to pReadr2.. 
e6c0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
e6d0: 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20   Alternatively, 
e6e0: 69 66 20 70 52 65 61 64 72 32 20 63 6f 6e 74 61  if pReadr2 conta
e6f0: 69 6e 73 20 74 68 65 20 73 6d 61 6c 6c 65 72 20  ins the smaller 
e700: 6f 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  of the two value
e710: 73 2c 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  s,.      ** set 
e720: 61 54 72 65 65 5b 69 5d 20 74 6f 20 69 74 73 20  aTree[i] to its 
e730: 69 6e 64 65 78 20 61 6e 64 20 75 70 64 61 74 65  index and update
e740: 20 70 52 65 61 64 72 31 2e 20 49 66 20 76 64 62   pReadr1. If vdb
e750: 65 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 28 29  eSorterCompare()
e760: 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 61 63  .      ** was ac
e770: 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 61 62  tually called ab
e780: 6f 76 65 2c 20 74 68 65 6e 20 70 54 61 73 6b 2d  ove, then pTask-
e790: 3e 70 55 6e 70 61 63 6b 65 64 20 6e 6f 77 20 63  >pUnpacked now c
e7a0: 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
e7b0: 20 61 20 76 61 6c 75 65 20 65 71 75 69 76 61 6c   a value equival
e7c0: 65 6e 74 20 74 6f 20 70 52 65 61 64 72 32 2e 20  ent to pReadr2. 
e7d0: 53 6f 20 73 65 74 20 70 4b 65 79 32 20 74 6f 20  So set pKey2 to 
e7e0: 4e 55 4c 4c 20 74 6f 20 70 72 65 76 65 6e 74 0a  NULL to prevent.
e7f0: 20 20 20 20 20 20 2a 2a 20 76 64 62 65 53 6f 72        ** vdbeSor
e800: 74 65 72 43 6f 6d 70 61 72 65 28 29 20 66 72 6f  terCompare() fro
e810: 6d 20 64 65 63 6f 64 69 6e 67 20 70 52 65 61 64  m decoding pRead
e820: 72 32 20 61 67 61 69 6e 2e 0a 20 20 20 20 20 20  r2 again..      
e830: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
e840: 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 77 65  he two values we
e850: 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74  re equal, then t
e860: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
e870: 65 20 6f 6c 64 65 73 74 0a 20 20 20 20 20 20 2a  e oldest.      *
e880: 2a 20 50 4d 41 20 73 68 6f 75 6c 64 20 62 65 20  * PMA should be 
e890: 63 6f 6e 73 69 64 65 72 65 64 20 73 6d 61 6c 6c  considered small
e8a0: 65 72 2e 20 54 68 65 20 56 64 62 65 53 6f 72 74  er. The VdbeSort
e8b0: 65 72 2e 61 52 65 61 64 72 5b 5d 20 61 72 72 61  er.aReadr[] arra
e8c0: 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 6f  y.      ** is so
e8d0: 72 74 65 64 20 66 72 6f 6d 20 6f 6c 64 65 73 74  rted from oldest
e8e0: 20 74 6f 20 6e 65 77 65 73 74 2c 20 73 6f 20 70   to newest, so p
e8f0: 52 65 61 64 72 31 20 63 6f 6e 74 61 69 6e 73 20  Readr1 contains 
e900: 6f 6c 64 65 72 20 76 61 6c 75 65 73 0a 20 20 20  older values.   
e910: 20 20 20 2a 2a 20 74 68 61 6e 20 70 52 65 61 64     ** than pRead
e920: 72 32 20 69 66 66 20 28 70 52 65 61 64 72 31 3c  r2 iff (pReadr1<
e930: 70 52 65 61 64 72 32 29 2e 20 20 2a 2f 0a 20 20  pReadr2).  */.  
e940: 20 20 20 20 69 66 28 20 69 52 65 73 3c 30 20 7c      if( iRes<0 |
e950: 7c 20 28 69 52 65 73 3d 3d 30 20 26 26 20 70 52  | (iRes==0 && pR
e960: 65 61 64 72 31 3c 70 52 65 61 64 72 32 29 20 29  eadr1<pReadr2) )
e970: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 72 67 65  {.        pMerge
e980: 72 2d 3e 61 54 72 65 65 5b 69 5d 20 3d 20 28 69  r->aTree[i] = (i
e990: 6e 74 29 28 70 52 65 61 64 72 31 20 2d 20 70 4d  nt)(pReadr1 - pM
e9a0: 65 72 67 65 72 2d 3e 61 52 65 61 64 72 29 3b 0a  erger->aReadr);.
e9b0: 20 20 20 20 20 20 20 20 70 52 65 61 64 72 32 20          pReadr2 
e9c0: 3d 20 26 70 4d 65 72 67 65 72 2d 3e 61 52 65 61  = &pMerger->aRea
e9d0: 64 72 5b 20 70 4d 65 72 67 65 72 2d 3e 61 54 72  dr[ pMerger->aTr
e9e0: 65 65 5b 69 20 5e 20 30 78 30 30 30 31 5d 20 5d  ee[i ^ 0x0001] ]
e9f0: 3b 0a 20 20 20 20 20 20 20 20 62 43 61 63 68 65  ;.        bCache
ea00: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 0;.      }el
ea10: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
ea20: 70 52 65 61 64 72 31 2d 3e 70 46 64 20 29 20 62  pReadr1->pFd ) b
ea30: 43 61 63 68 65 64 20 3d 20 30 3b 0a 20 20 20 20  Cached = 0;.    
ea40: 20 20 20 20 70 4d 65 72 67 65 72 2d 3e 61 54 72      pMerger->aTr
ea50: 65 65 5b 69 5d 20 3d 20 28 69 6e 74 29 28 70 52  ee[i] = (int)(pR
ea60: 65 61 64 72 32 20 2d 20 70 4d 65 72 67 65 72 2d  eadr2 - pMerger-
ea70: 3e 61 52 65 61 64 72 29 3b 0a 20 20 20 20 20 20  >aReadr);.      
ea80: 20 20 70 52 65 61 64 72 31 20 3d 20 26 70 4d 65    pReadr1 = &pMe
ea90: 72 67 65 72 2d 3e 61 52 65 61 64 72 5b 20 70 4d  rger->aReadr[ pM
eaa0: 65 72 67 65 72 2d 3e 61 54 72 65 65 5b 69 20 5e  erger->aTree[i ^
eab0: 20 30 78 30 30 30 31 5d 20 5d 3b 0a 20 20 20 20   0x0001] ];.    
eac0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70    }.    }.    *p
ead0: 62 45 6f 66 20 3d 20 28 70 4d 65 72 67 65 72 2d  bEof = (pMerger-
eae0: 3e 61 52 65 61 64 72 5b 70 4d 65 72 67 65 72 2d  >aReadr[pMerger-
eaf0: 3e 61 54 72 65 65 5b 31 5d 5d 2e 70 46 64 3d 3d  >aTree[1]].pFd==
eb00: 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  0);.  }..  retur
eb10: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
eb20: 20 3f 20 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63   ? pTask->pUnpac
eb30: 6b 65 64 2d 3e 65 72 72 43 6f 64 65 20 3a 20 72  ked->errCode : r
eb40: 63 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  c);.}..#if SQLIT
eb50: 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
eb60: 45 41 44 53 3e 30 0a 2f 2a 0a 2a 2a 20 54 68 65  EADS>0./*.** The
eb70: 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65 20 66 6f   main routine fo
eb80: 72 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72  r background thr
eb90: 65 61 64 73 20 74 68 61 74 20 77 72 69 74 65 20  eads that write 
eba0: 6c 65 76 65 6c 2d 30 20 50 4d 41 73 2e 0a 2a 2f  level-0 PMAs..*/
ebb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 76 64  .static void *vd
ebc0: 62 65 53 6f 72 74 65 72 46 6c 75 73 68 54 68 72  beSorterFlushThr
ebd0: 65 61 64 28 76 6f 69 64 20 2a 70 43 74 78 29 7b  ead(void *pCtx){
ebe0: 0a 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a  .  SortSubtask *
ebf0: 70 54 61 73 6b 20 3d 20 28 53 6f 72 74 53 75 62  pTask = (SortSub
ec00: 74 61 73 6b 2a 29 70 43 74 78 3b 0a 20 20 69 6e  task*)pCtx;.  in
ec10: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ec30: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
ec40: 20 20 61 73 73 65 72 74 28 20 70 54 61 73 6b 2d    assert( pTask-
ec50: 3e 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 72  >bDone==0 );.  r
ec60: 63 20 3d 20 76 64 62 65 53 6f 72 74 65 72 4c 69  c = vdbeSorterLi
ec70: 73 74 54 6f 50 4d 41 28 70 54 61 73 6b 2c 20 26  stToPMA(pTask, &
ec80: 70 54 61 73 6b 2d 3e 6c 69 73 74 29 3b 0a 20 20  pTask->list);.  
ec90: 70 54 61 73 6b 2d 3e 62 44 6f 6e 65 20 3d 20 31  pTask->bDone = 1
eca0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ecb0: 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 72 63 29  E_INT_TO_PTR(rc)
ecc0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
ecd0: 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
ece0: 54 48 52 45 41 44 53 3e 30 20 2a 2f 0a 0a 2f 2a  THREADS>0 */../*
ecf0: 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 75  .** Flush the cu
ed00: 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
ed10: 66 20 56 64 62 65 53 6f 72 74 65 72 2e 6c 69 73  f VdbeSorter.lis
ed20: 74 20 74 6f 20 61 20 6e 65 77 20 50 4d 41 2c 20  t to a new PMA, 
ed30: 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 75 73 69 6e  possibly.** usin
ed40: 67 20 61 20 62 61 63 6b 67 72 6f 75 6e 64 20 74  g a background t
ed50: 68 72 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  hread..*/.static
ed60: 20 69 6e 74 20 76 64 62 65 53 6f 72 74 65 72 46   int vdbeSorterF
ed70: 6c 75 73 68 50 4d 41 28 56 64 62 65 53 6f 72 74  lushPMA(VdbeSort
ed80: 65 72 20 2a 70 53 6f 72 74 65 72 29 7b 0a 23 69  er *pSorter){.#i
ed90: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  f SQLITE_MAX_WOR
eda0: 4b 45 52 5f 54 48 52 45 41 44 53 3d 3d 30 0a 20  KER_THREADS==0. 
edb0: 20 70 53 6f 72 74 65 72 2d 3e 62 55 73 65 50 4d   pSorter->bUsePM
edc0: 41 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  A = 1;.  return 
edd0: 76 64 62 65 53 6f 72 74 65 72 4c 69 73 74 54 6f  vdbeSorterListTo
ede0: 50 4d 41 28 26 70 53 6f 72 74 65 72 2d 3e 61 54  PMA(&pSorter->aT
edf0: 61 73 6b 5b 30 5d 2c 20 26 70 53 6f 72 74 65 72  ask[0], &pSorter
ee00: 2d 3e 6c 69 73 74 29 3b 0a 23 65 6c 73 65 0a 20  ->list);.#else. 
ee10: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ee20: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  _OK;.  int i;.  
ee30: 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61  SortSubtask *pTa
ee40: 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 68  sk = 0;    /* Th
ee50: 72 65 61 64 20 63 6f 6e 74 65 78 74 20 75 73 65  read context use
ee60: 64 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20  d to create new 
ee70: 50 4d 41 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 6f  PMA */.  int nWo
ee80: 72 6b 65 72 20 3d 20 28 70 53 6f 72 74 65 72 2d  rker = (pSorter-
ee90: 3e 6e 54 61 73 6b 2d 31 29 3b 0a 0a 20 20 2f 2a  >nTask-1);..  /*
eea0: 20 53 65 74 20 74 68 65 20 66 6c 61 67 20 74 6f   Set the flag to
eeb0: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 61   indicate that a
eec0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 50 4d 41 20  t least one PMA 
eed0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
eee0: 2e 20 0a 20 20 2a 2a 20 4f 72 20 77 69 6c 6c 20  . .  ** Or will 
eef0: 62 65 2c 20 61 6e 79 68 6f 77 2e 20 20 2a 2f 0a  be, anyhow.  */.
ef00: 20 20 70 53 6f 72 74 65 72 2d 3e 62 55 73 65 50    pSorter->bUseP
ef10: 4d 41 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 53 65  MA = 1;..  /* Se
ef20: 6c 65 63 74 20 61 20 73 75 62 2d 74 61 73 6b 20  lect a sub-task 
ef30: 74 6f 20 73 6f 72 74 20 61 6e 64 20 66 6c 75 73  to sort and flus
ef40: 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 69  h the current li
ef50: 73 74 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 0a  st of in-memory.
ef60: 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 74 6f 20    ** records to 
ef70: 64 69 73 6b 2e 20 49 66 20 74 68 65 20 73 6f 72  disk. If the sor
ef80: 74 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ter is running i
ef90: 6e 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64  n multi-threaded
efa0: 20 6d 6f 64 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e   mode,.  ** roun
efb0: 64 2d 72 6f 62 69 6e 20 62 65 74 77 65 65 6e 20  d-robin between 
efc0: 74 68 65 20 66 69 72 73 74 20 28 70 53 6f 72 74  the first (pSort
efd0: 65 72 2d 3e 6e 54 61 73 6b 2d 31 29 20 74 61 73  er->nTask-1) tas
efe0: 6b 73 2e 20 45 78 63 65 70 74 2c 20 69 66 0a 20  ks. Except, if. 
eff0: 20 2a 2a 20 74 68 65 20 62 61 63 6b 67 72 6f 75   ** the backgrou
f000: 6e 64 20 74 68 72 65 61 64 20 66 72 6f 6d 20 61  nd thread from a
f010: 20 73 75 62 2d 74 61 73 6b 73 20 70 72 65 76 69   sub-tasks previ
f020: 6f 75 73 20 74 75 72 6e 20 69 73 20 73 74 69 6c  ous turn is stil
f030: 6c 20 72 75 6e 6e 69 6e 67 2c 0a 20 20 2a 2a 20  l running,.  ** 
f040: 73 6b 69 70 20 69 74 2e 20 49 66 20 74 68 65 20  skip it. If the 
f050: 66 69 72 73 74 20 28 70 53 6f 72 74 65 72 2d 3e  first (pSorter->
f060: 6e 54 61 73 6b 2d 31 29 20 73 75 62 2d 74 61 73  nTask-1) sub-tas
f070: 6b 73 20 61 72 65 20 61 6c 6c 20 73 74 69 6c 6c  ks are all still
f080: 20 62 75 73 79 2c 0a 20 20 2a 2a 20 66 61 6c 6c   busy,.  ** fall
f090: 20 62 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 74   back to using t
f0a0: 68 65 20 66 69 6e 61 6c 20 73 75 62 2d 74 61 73  he final sub-tas
f0b0: 6b 2e 20 54 68 65 20 66 69 72 73 74 20 28 70 53  k. The first (pS
f0c0: 6f 72 74 65 72 2d 3e 6e 54 61 73 6b 2d 31 29 0a  orter->nTask-1).
f0d0: 20 20 2a 2a 20 73 75 62 2d 74 61 73 6b 73 20 61    ** sub-tasks a
f0e0: 72 65 20 70 72 65 66 65 72 65 64 20 61 73 20 74  re prefered as t
f0f0: 68 65 79 20 75 73 65 20 62 61 63 6b 67 72 6f 75  hey use backgrou
f100: 6e 64 20 74 68 72 65 61 64 73 20 2d 20 74 68 65  nd threads - the
f110: 20 66 69 6e 61 6c 20 0a 20 20 2a 2a 20 73 75 62   final .  ** sub
f120: 2d 74 61 73 6b 20 75 73 65 73 20 74 68 65 20 6d  -task uses the m
f130: 61 69 6e 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20  ain thread. */. 
f140: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 57 6f 72   for(i=0; i<nWor
f150: 6b 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ker; i++){.    i
f160: 6e 74 20 69 54 65 73 74 20 3d 20 28 70 53 6f 72  nt iTest = (pSor
f170: 74 65 72 2d 3e 69 50 72 65 76 20 2b 20 69 20 2b  ter->iPrev + i +
f180: 20 31 29 20 25 20 6e 57 6f 72 6b 65 72 3b 0a 20   1) % nWorker;. 
f190: 20 20 20 70 54 61 73 6b 20 3d 20 26 70 53 6f 72     pTask = &pSor
f1a0: 74 65 72 2d 3e 61 54 61 73 6b 5b 69 54 65 73 74  ter->aTask[iTest
f1b0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 54 61 73 6b  ];.    if( pTask
f1c0: 2d 3e 62 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20  ->bDone ){.     
f1d0: 20 72 63 20 3d 20 76 64 62 65 53 6f 72 74 65 72   rc = vdbeSorter
f1e0: 4a 6f 69 6e 54 68 72 65 61 64 28 70 54 61 73 6b  JoinThread(pTask
f1f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
f200: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
f210: 7c 20 70 54 61 73 6b 2d 3e 70 54 68 72 65 61 64  | pTask->pThread
f220: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ==0 ) break;.  }
f230: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
f240: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
f250: 20 69 3d 3d 6e 57 6f 72 6b 65 72 20 29 7b 0a 20   i==nWorker ){. 
f260: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
f270: 66 6f 72 65 67 72 6f 75 6e 64 20 74 68 72 65 61  foreground threa
f280: 64 20 66 6f 72 20 74 68 69 73 20 6f 70 65 72 61  d for this opera
f290: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 72 63  tion */.      rc
f2a0: 20 3d 20 76 64 62 65 53 6f 72 74 65 72 4c 69 73   = vdbeSorterLis
f2b0: 74 54 6f 50 4d 41 28 26 70 53 6f 72 74 65 72 2d  tToPMA(&pSorter-
f2c0: 3e 61 54 61 73 6b 5b 6e 57 6f 72 6b 65 72 5d 2c  >aTask[nWorker],
f2d0: 20 26 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 29   &pSorter->list)
f2e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f2f0: 20 20 20 2f 2a 20 4c 61 75 6e 63 68 20 61 20 62     /* Launch a b
f300: 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64  ackground thread
f310: 20 66 6f 72 20 74 68 69 73 20 6f 70 65 72 61 74   for this operat
f320: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ion */.      u8 
f330: 2a 61 4d 65 6d 20 3d 20 70 54 61 73 6b 2d 3e 6c  *aMem = pTask->l
f340: 69 73 74 2e 61 4d 65 6d 6f 72 79 3b 0a 20 20 20  ist.aMemory;.   
f350: 20 20 20 76 6f 69 64 20 2a 70 43 74 78 20 3d 20     void *pCtx = 
f360: 28 76 6f 69 64 2a 29 70 54 61 73 6b 3b 0a 0a 20  (void*)pTask;.. 
f370: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
f380: 73 6b 2d 3e 70 54 68 72 65 61 64 3d 3d 30 20 26  sk->pThread==0 &
f390: 26 20 70 54 61 73 6b 2d 3e 62 44 6f 6e 65 3d 3d  & pTask->bDone==
f3a0: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
f3b0: 74 28 20 70 54 61 73 6b 2d 3e 6c 69 73 74 2e 70  t( pTask->list.p
f3c0: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
f3d0: 20 61 73 73 65 72 74 28 20 70 54 61 73 6b 2d 3e   assert( pTask->
f3e0: 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 3d 3d 30 20  list.aMemory==0 
f3f0: 7c 7c 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74  || pSorter->list
f400: 2e 61 4d 65 6d 6f 72 79 21 3d 30 20 29 3b 0a 0a  .aMemory!=0 );..
f410: 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 69        pSorter->i
f420: 50 72 65 76 20 3d 20 28 75 38 29 28 70 54 61 73  Prev = (u8)(pTas
f430: 6b 20 2d 20 70 53 6f 72 74 65 72 2d 3e 61 54 61  k - pSorter->aTa
f440: 73 6b 29 3b 0a 20 20 20 20 20 20 70 54 61 73 6b  sk);.      pTask
f450: 2d 3e 6c 69 73 74 20 3d 20 70 53 6f 72 74 65 72  ->list = pSorter
f460: 2d 3e 6c 69 73 74 3b 0a 20 20 20 20 20 20 70 53  ->list;.      pS
f470: 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69 73  orter->list.pLis
f480: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 6f  t = 0;.      pSo
f490: 72 74 65 72 2d 3e 6c 69 73 74 2e 73 7a 50 4d 41  rter->list.szPMA
f4a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
f4b0: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  aMem ){.        
f4c0: 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 61 4d  pSorter->list.aM
f4d0: 65 6d 6f 72 79 20 3d 20 61 4d 65 6d 3b 0a 20 20  emory = aMem;.  
f4e0: 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 6e        pSorter->n
f4f0: 4d 65 6d 6f 72 79 20 3d 20 73 71 6c 69 74 65 33  Memory = sqlite3
f500: 4d 61 6c 6c 6f 63 53 69 7a 65 28 61 4d 65 6d 29  MallocSize(aMem)
f510: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f520: 28 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e  ( pSorter->list.
f530: 61 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  aMemory ){.     
f540: 20 20 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74     pSorter->list
f550: 2e 61 4d 65 6d 6f 72 79 20 3d 20 73 71 6c 69 74  .aMemory = sqlit
f560: 65 33 4d 61 6c 6c 6f 63 28 70 53 6f 72 74 65 72  e3Malloc(pSorter
f570: 2d 3e 6e 4d 65 6d 6f 72 79 29 3b 0a 20 20 20 20  ->nMemory);.    
f580: 20 20 20 20 69 66 28 20 21 70 53 6f 72 74 65 72      if( !pSorter
f590: 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 20 29  ->list.aMemory )
f5a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
f5b0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
f5c0: 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 76   }..      rc = v
f5d0: 64 62 65 53 6f 72 74 65 72 43 72 65 61 74 65 54  dbeSorterCreateT
f5e0: 68 72 65 61 64 28 70 54 61 73 6b 2c 20 76 64 62  hread(pTask, vdb
f5f0: 65 53 6f 72 74 65 72 46 6c 75 73 68 54 68 72 65  eSorterFlushThre
f600: 61 64 2c 20 70 43 74 78 29 3b 0a 20 20 20 20 7d  ad, pCtx);.    }
f610: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
f620: 63 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  c;.#endif /* SQL
f630: 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
f640: 48 52 45 41 44 53 21 3d 30 20 2a 2f 0a 7d 0a 0a  HREADS!=0 */.}..
f650: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 72 65 63 6f  /*.** Add a reco
f660: 72 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72  rd to the sorter
f670: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f680: 56 64 62 65 53 6f 72 74 65 72 57 72 69 74 65 28  VdbeSorterWrite(
f690: 0a 20 20 63 6f 6e 73 74 20 56 64 62 65 43 75 72  .  const VdbeCur
f6a0: 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20  sor *pCsr,      
f6b0: 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63 75 72     /* Sorter cur
f6c0: 73 6f 72 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 56  sor */.  Mem *pV
f6d0: 61 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  al              
f6e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
f6f0: 72 79 20 63 65 6c 6c 20 63 6f 6e 74 61 69 6e 69  ry cell containi
f700: 6e 67 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  ng record */.){.
f710: 20 20 56 64 62 65 53 6f 72 74 65 72 20 2a 70 53    VdbeSorter *pS
f720: 6f 72 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  orter;.  int rc 
f730: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
f740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
f750: 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 53 6f 72  rn Code */.  Sor
f760: 74 65 72 52 65 63 6f 72 64 20 2a 70 4e 65 77 3b  terRecord *pNew;
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f780: 4e 65 77 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74  New list element
f790: 20 2a 2f 0a 20 20 69 6e 74 20 62 46 6c 75 73 68   */.  int bFlush
f7a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f7b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
f7c0: 20 66 6c 75 73 68 20 63 6f 6e 74 65 6e 74 73 20   flush contents 
f7d0: 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 50 4d 41  of memory to PMA
f7e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 71 3b 20   */.  int nReq; 
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
f810: 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65  f memory require
f820: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 4d 41 3b  d */.  int nPMA;
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
f850: 6f 66 20 50 4d 41 20 73 70 61 63 65 20 72 65 71  of PMA space req
f860: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74  uired */.  int t
f870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65             /* se
f890: 72 69 61 6c 20 74 79 70 65 20 6f 66 20 66 69 72  rial type of fir
f8a0: 73 74 20 72 65 63 6f 72 64 20 66 69 65 6c 64 20  st record field 
f8b0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  */..  assert( pC
f8c0: 73 72 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  sr->eCurType==CU
f8d0: 52 54 59 50 45 5f 53 4f 52 54 45 52 20 29 3b 0a  RTYPE_SORTER );.
f8e0: 20 20 70 53 6f 72 74 65 72 20 3d 20 70 43 73 72    pSorter = pCsr
f8f0: 2d 3e 75 63 2e 70 53 6f 72 74 65 72 3b 0a 20 20  ->uc.pSorter;.  
f900: 67 65 74 56 61 72 69 6e 74 33 32 28 28 63 6f 6e  getVarint32((con
f910: 73 74 20 75 38 2a 29 26 70 56 61 6c 2d 3e 7a 5b  st u8*)&pVal->z[
f920: 31 5d 2c 20 74 29 3b 0a 20 20 69 66 28 20 74 3e  1], t);.  if( t>
f930: 30 20 26 26 20 74 3c 31 30 20 26 26 20 74 21 3d  0 && t<10 && t!=
f940: 37 20 29 7b 0a 20 20 20 20 70 53 6f 72 74 65 72  7 ){.    pSorter
f950: 2d 3e 74 79 70 65 4d 61 73 6b 20 26 3d 20 53 4f  ->typeMask &= SO
f960: 52 54 45 52 5f 54 59 50 45 5f 49 4e 54 45 47 45  RTER_TYPE_INTEGE
f970: 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74  R;.  }else if( t
f980: 3e 31 30 20 26 26 20 28 74 20 26 20 30 78 30 31  >10 && (t & 0x01
f990: 29 20 29 7b 0a 20 20 20 20 70 53 6f 72 74 65 72  ) ){.    pSorter
f9a0: 2d 3e 74 79 70 65 4d 61 73 6b 20 26 3d 20 53 4f  ->typeMask &= SO
f9b0: 52 54 45 52 5f 54 59 50 45 5f 54 45 58 54 3b 0a  RTER_TYPE_TEXT;.
f9c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 6f    }else{.    pSo
f9d0: 72 74 65 72 2d 3e 74 79 70 65 4d 61 73 6b 20 3d  rter->typeMask =
f9e0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   0;.  }..  asser
f9f0: 74 28 20 70 53 6f 72 74 65 72 20 29 3b 0a 0a 20  t( pSorter );.. 
fa00: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
fa10: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
fa20: 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
fa30: 74 73 20 6f 66 20 6d 65 6d 6f 72 79 20 73 68 6f  ts of memory sho
fa40: 75 6c 64 20 62 65 0a 20 20 2a 2a 20 66 6c 75 73  uld be.  ** flus
fa50: 68 65 64 20 74 6f 20 61 20 50 4d 41 20 62 65 66  hed to a PMA bef
fa60: 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  ore continuing. 
fa70: 49 66 20 73 6f 2c 20 64 6f 20 73 6f 2e 0a 20 20  If so, do so..  
fa80: 2a 2a 0a 20 20 2a 2a 20 49 66 20 75 73 69 6e 67  **.  ** If using
fa90: 20 74 68 65 20 73 69 6e 67 6c 65 20 6c 61 72 67   the single larg
faa0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6d 6f 64  e allocation mod
fab0: 65 20 28 70 53 6f 72 74 65 72 2d 3e 61 4d 65 6d  e (pSorter->aMem
fac0: 6f 72 79 21 3d 30 29 2c 20 74 68 65 6e 0a 20 20  ory!=0), then.  
fad0: 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 63 6f 6e  ** flush the con
fae0: 74 65 6e 74 73 20 6f 66 20 6d 65 6d 6f 72 79 20  tents of memory 
faf0: 74 6f 20 61 20 6e 65 77 20 50 4d 41 20 69 66 20  to a new PMA if 
fb00: 28 61 29 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  (a) at least one
fb10: 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61   value is.  ** a
fb20: 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79  lready in memory
fb30: 20 61 6e 64 20 28 62 29 20 74 68 65 20 6e 65 77   and (b) the new
fb40: 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20   value will not 
fb50: 66 69 74 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 20  fit in memory.. 
fb60: 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20 69 66   ** .  ** Or, if
fb70: 20 75 73 69 6e 67 20 73 65 70 61 72 61 74 65 20   using separate 
fb80: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 66 6f 72 20  allocations for 
fb90: 65 61 63 68 20 72 65 63 6f 72 64 2c 20 66 6c 75  each record, flu
fba0: 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  sh the contents.
fbb0: 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 74    ** of memory t
fbc0: 6f 20 61 20 50 4d 41 20 69 66 20 65 69 74 68 65  o a PMA if eithe
fbd0: 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r of the followi
fbe0: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a  ng are true:.  *
fbf0: 2a 0a 20 20 2a 2a 20 20 20 2a 20 54 68 65 20 74  *.  **   * The t
fc00: 6f 74 61 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  otal memory allo
fc10: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 69 6e  cated for the in
fc20: 2d 6d 65 6d 6f 72 79 20 6c 69 73 74 20 69 73 20  -memory list is 
fc30: 67 72 65 61 74 65 72 20 0a 20 20 2a 2a 20 20 20  greater .  **   
fc40: 20 20 74 68 61 6e 20 28 70 61 67 65 2d 73 69 7a    than (page-siz
fc50: 65 20 2a 20 63 61 63 68 65 2d 73 69 7a 65 29 2c  e * cache-size),
fc60: 20 6f 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20   or.  **.  **   
fc70: 2a 20 54 68 65 20 74 6f 74 61 6c 20 6d 65 6d 6f  * The total memo
fc80: 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ry allocated for
fc90: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6c   the in-memory l
fca0: 69 73 74 20 69 73 20 67 72 65 61 74 65 72 20 0a  ist is greater .
fcb0: 20 20 2a 2a 20 20 20 20 20 74 68 61 6e 20 28 70    **     than (p
fcc0: 61 67 65 2d 73 69 7a 65 20 2a 20 31 30 29 20 61  age-size * 10) a
fcd0: 6e 64 20 73 71 6c 69 74 65 33 48 65 61 70 4e 65  nd sqlite3HeapNe
fce0: 61 72 6c 79 46 75 6c 6c 28 29 20 72 65 74 75 72  arlyFull() retur
fcf0: 6e 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20  ns true..  */.  
fd00: 6e 52 65 71 20 3d 20 70 56 61 6c 2d 3e 6e 20 2b  nReq = pVal->n +
fd10: 20 73 69 7a 65 6f 66 28 53 6f 72 74 65 72 52 65   sizeof(SorterRe
fd20: 63 6f 72 64 29 3b 0a 20 20 6e 50 4d 41 20 3d 20  cord);.  nPMA = 
fd30: 70 56 61 6c 2d 3e 6e 20 2b 20 73 71 6c 69 74 65  pVal->n + sqlite
fd40: 33 56 61 72 69 6e 74 4c 65 6e 28 70 56 61 6c 2d  3VarintLen(pVal-
fd50: 3e 6e 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  >n);.  if( pSort
fd60: 65 72 2d 3e 6d 78 50 6d 61 53 69 7a 65 20 29 7b  er->mxPmaSize ){
fd70: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 65 72  .    if( pSorter
fd80: 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 20 29  ->list.aMemory )
fd90: 7b 0a 20 20 20 20 20 20 62 46 6c 75 73 68 20 3d  {.      bFlush =
fda0: 20 70 53 6f 72 74 65 72 2d 3e 69 4d 65 6d 6f 72   pSorter->iMemor
fdb0: 79 20 26 26 20 28 70 53 6f 72 74 65 72 2d 3e 69  y && (pSorter->i
fdc0: 4d 65 6d 6f 72 79 2b 6e 52 65 71 29 20 3e 20 70  Memory+nReq) > p
fdd0: 53 6f 72 74 65 72 2d 3e 6d 78 50 6d 61 53 69 7a  Sorter->mxPmaSiz
fde0: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
fdf0: 20 20 20 20 62 46 6c 75 73 68 20 3d 20 28 0a 20      bFlush = (. 
fe00: 20 20 20 20 20 20 20 20 20 28 70 53 6f 72 74 65           (pSorte
fe10: 72 2d 3e 6c 69 73 74 2e 73 7a 50 4d 41 20 3e 20  r->list.szPMA > 
fe20: 70 53 6f 72 74 65 72 2d 3e 6d 78 50 6d 61 53 69  pSorter->mxPmaSi
fe30: 7a 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  ze).       || (p
fe40: 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 73 7a 50  Sorter->list.szP
fe50: 4d 41 20 3e 20 70 53 6f 72 74 65 72 2d 3e 6d 6e  MA > pSorter->mn
fe60: 50 6d 61 53 69 7a 65 20 26 26 20 73 71 6c 69 74  PmaSize && sqlit
fe70: 65 33 48 65 61 70 4e 65 61 72 6c 79 46 75 6c 6c  e3HeapNearlyFull
fe80: 28 29 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ()).      );.   
fe90: 20 7d 0a 20 20 20 20 69 66 28 20 62 46 6c 75 73   }.    if( bFlus
fea0: 68 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  h ){.      rc = 
feb0: 76 64 62 65 53 6f 72 74 65 72 46 6c 75 73 68 50  vdbeSorterFlushP
fec0: 4d 41 28 70 53 6f 72 74 65 72 29 3b 0a 20 20 20  MA(pSorter);.   
fed0: 20 20 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74     pSorter->list
fee0: 2e 73 7a 50 4d 41 20 3d 20 30 3b 0a 20 20 20 20  .szPMA = 0;.    
fef0: 20 20 70 53 6f 72 74 65 72 2d 3e 69 4d 65 6d 6f    pSorter->iMemo
ff00: 72 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  ry = 0;.      as
ff10: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
ff20: 5f 4f 4b 20 7c 7c 20 70 53 6f 72 74 65 72 2d 3e  _OK || pSorter->
ff30: 6c 69 73 74 2e 70 4c 69 73 74 3d 3d 30 20 29 3b  list.pList==0 );
ff40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 53  .    }.  }..  pS
ff50: 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 73 7a 50 4d  orter->list.szPM
ff60: 41 20 2b 3d 20 6e 50 4d 41 3b 0a 20 20 69 66 28  A += nPMA;.  if(
ff70: 20 6e 50 4d 41 3e 70 53 6f 72 74 65 72 2d 3e 6d   nPMA>pSorter->m
ff80: 78 4b 65 79 73 69 7a 65 20 29 7b 0a 20 20 20 20  xKeysize ){.    
ff90: 70 53 6f 72 74 65 72 2d 3e 6d 78 4b 65 79 73 69  pSorter->mxKeysi
ffa0: 7a 65 20 3d 20 6e 50 4d 41 3b 0a 20 20 7d 0a 0a  ze = nPMA;.  }..
ffb0: 20 20 69 66 28 20 70 53 6f 72 74 65 72 2d 3e 6c    if( pSorter->l
ffc0: 69 73 74 2e 61 4d 65 6d 6f 72 79 20 29 7b 0a 20  ist.aMemory ){. 
ffd0: 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 53     int nMin = pS
ffe0: 6f 72 74 65 72 2d 3e 69 4d 65 6d 6f 72 79 20 2b  orter->iMemory +
fff0: 20 6e 52 65 71 3b 0a 0a 20 20 20 20 69 66 28 20   nReq;..    if( 
10000 6e 4d 69 6e 3e 70 53 6f 72 74 65 72 2d 3e 6e 4d  nMin>pSorter->nM
10010 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 75  emory ){.      u
10020 38 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20 69  8 *aNew;.      i
10030 6e 74 20 69 4c 69 73 74 4f 66 66 20 3d 20 28 75  nt iListOff = (u
10040 38 2a 29 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74  8*)pSorter->list
10050 2e 70 4c 69 73 74 20 2d 20 70 53 6f 72 74 65 72  .pList - pSorter
10060 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 3b 0a  ->list.aMemory;.
10070 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d        int nNew =
10080 20 70 53 6f 72 74 65 72 2d 3e 6e 4d 65 6d 6f 72   pSorter->nMemor
10090 79 20 2a 20 32 3b 0a 20 20 20 20 20 20 77 68 69  y * 2;.      whi
100a0 6c 65 28 20 6e 4e 65 77 20 3c 20 6e 4d 69 6e 20  le( nNew < nMin 
100b0 29 20 6e 4e 65 77 20 3d 20 6e 4e 65 77 2a 32 3b  ) nNew = nNew*2;
100c0 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 20  .      if( nNew 
100d0 3e 20 70 53 6f 72 74 65 72 2d 3e 6d 78 50 6d 61  > pSorter->mxPma
100e0 53 69 7a 65 20 29 20 6e 4e 65 77 20 3d 20 70 53  Size ) nNew = pS
100f0 6f 72 74 65 72 2d 3e 6d 78 50 6d 61 53 69 7a 65  orter->mxPmaSize
10100 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77  ;.      if( nNew
10110 20 3c 20 6e 4d 69 6e 20 29 20 6e 4e 65 77 20 3d   < nMin ) nNew =
10120 20 6e 4d 69 6e 3b 0a 0a 20 20 20 20 20 20 61 4e   nMin;..      aN
10130 65 77 20 3d 20 73 71 6c 69 74 65 33 52 65 61 6c  ew = sqlite3Real
10140 6c 6f 63 28 70 53 6f 72 74 65 72 2d 3e 6c 69 73  loc(pSorter->lis
10150 74 2e 61 4d 65 6d 6f 72 79 2c 20 6e 4e 65 77 29  t.aMemory, nNew)
10160 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e 65  ;.      if( !aNe
10170 77 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  w ) return SQLIT
10180 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
10190 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73      pSorter->lis
101a0 74 2e 70 4c 69 73 74 20 3d 20 28 53 6f 72 74 65  t.pList = (Sorte
101b0 72 52 65 63 6f 72 64 2a 29 26 61 4e 65 77 5b 69  rRecord*)&aNew[i
101c0 4c 69 73 74 4f 66 66 5d 3b 0a 20 20 20 20 20 20  ListOff];.      
101d0 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 61 4d  pSorter->list.aM
101e0 65 6d 6f 72 79 20 3d 20 61 4e 65 77 3b 0a 20 20  emory = aNew;.  
101f0 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 6e 4d 65      pSorter->nMe
10200 6d 6f 72 79 20 3d 20 6e 4e 65 77 3b 0a 20 20 20  mory = nNew;.   
10210 20 7d 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20 28   }..    pNew = (
10220 53 6f 72 74 65 72 52 65 63 6f 72 64 2a 29 26 70  SorterRecord*)&p
10230 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 61 4d 65  Sorter->list.aMe
10240 6d 6f 72 79 5b 70 53 6f 72 74 65 72 2d 3e 69 4d  mory[pSorter->iM
10250 65 6d 6f 72 79 5d 3b 0a 20 20 20 20 70 53 6f 72  emory];.    pSor
10260 74 65 72 2d 3e 69 4d 65 6d 6f 72 79 20 2b 3d 20  ter->iMemory += 
10270 52 4f 55 4e 44 38 28 6e 52 65 71 29 3b 0a 20 20  ROUND8(nReq);.  
10280 20 20 69 66 28 20 70 53 6f 72 74 65 72 2d 3e 6c    if( pSorter->l
10290 69 73 74 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ist.pList ){.   
102a0 20 20 20 70 4e 65 77 2d 3e 75 2e 69 4e 65 78 74     pNew->u.iNext
102b0 20 3d 20 28 69 6e 74 29 28 28 75 38 2a 29 28 70   = (int)((u8*)(p
102c0 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69  Sorter->list.pLi
102d0 73 74 29 20 2d 20 70 53 6f 72 74 65 72 2d 3e 6c  st) - pSorter->l
102e0 69 73 74 2e 61 4d 65 6d 6f 72 79 29 3b 0a 20 20  ist.aMemory);.  
102f0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
10300 20 70 4e 65 77 20 3d 20 28 53 6f 72 74 65 72 52   pNew = (SorterR
10310 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 4d  ecord *)sqlite3M
10320 61 6c 6c 6f 63 28 6e 52 65 71 29 3b 0a 20 20 20  alloc(nReq);.   
10330 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
10340 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10350 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
10360 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
10370 75 2e 70 4e 65 78 74 20 3d 20 70 53 6f 72 74 65  u.pNext = pSorte
10380 72 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 3b 0a 20  r->list.pList;. 
10390 20 7d 0a 0a 20 20 6d 65 6d 63 70 79 28 53 52 56   }..  memcpy(SRV
103a0 41 4c 28 70 4e 65 77 29 2c 20 70 56 61 6c 2d 3e  AL(pNew), pVal->
103b0 7a 2c 20 70 56 61 6c 2d 3e 6e 29 3b 0a 20 20 70  z, pVal->n);.  p
103c0 4e 65 77 2d 3e 6e 56 61 6c 20 3d 20 70 56 61 6c  New->nVal = pVal
103d0 2d 3e 6e 3b 0a 20 20 70 53 6f 72 74 65 72 2d 3e  ->n;.  pSorter->
103e0 6c 69 73 74 2e 70 4c 69 73 74 20 3d 20 70 4e 65  list.pList = pNe
103f0 77 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w;..  return rc;
10400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 6b  .}../*.** Read k
10410 65 79 73 20 66 72 6f 6d 20 70 49 6e 63 72 2d 3e  eys from pIncr->
10420 70 4d 65 72 67 65 72 20 61 6e 64 20 70 6f 70 75  pMerger and popu
10430 6c 61 74 65 20 70 49 6e 63 72 2d 3e 61 46 69 6c  late pIncr->aFil
10440 65 5b 31 5d 2e 20 54 68 65 20 66 6f 72 6d 61 74  e[1]. The format
10450 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 20  .** of the data 
10460 73 74 6f 72 65 64 20 69 6e 20 61 46 69 6c 65 5b  stored in aFile[
10470 31 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  1] is the same a
10480 73 20 74 68 61 74 20 75 73 65 64 20 62 79 20 72  s that used by r
10490 65 67 75 6c 61 72 20 50 4d 41 73 2c 0a 2a 2a 20  egular PMAs,.** 
104a0 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
104b0 6e 75 6d 62 65 72 2d 6f 66 2d 62 79 74 65 73 20  number-of-bytes 
104c0 76 61 72 69 6e 74 20 69 73 20 6f 6d 69 74 74 65  varint is omitte
104d0 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74  d from the start
104e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
104f0 76 64 62 65 49 6e 63 72 50 6f 70 75 6c 61 74 65  vdbeIncrPopulate
10500 28 49 6e 63 72 4d 65 72 67 65 72 20 2a 70 49 6e  (IncrMerger *pIn
10510 63 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  cr){.  int rc = 
10520 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
10530 20 72 63 32 3b 0a 20 20 69 36 34 20 69 53 74 61   rc2;.  i64 iSta
10540 72 74 20 3d 20 70 49 6e 63 72 2d 3e 69 53 74 61  rt = pIncr->iSta
10550 72 74 4f 66 66 3b 0a 20 20 53 6f 72 74 65 72 46  rtOff;.  SorterF
10560 69 6c 65 20 2a 70 4f 75 74 20 3d 20 26 70 49 6e  ile *pOut = &pIn
10570 63 72 2d 3e 61 46 69 6c 65 5b 31 5d 3b 0a 20 20  cr->aFile[1];.  
10580 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61  SortSubtask *pTa
10590 73 6b 20 3d 20 70 49 6e 63 72 2d 3e 70 54 61 73  sk = pIncr->pTas
105a0 6b 3b 0a 20 20 4d 65 72 67 65 45 6e 67 69 6e 65  k;.  MergeEngine
105b0 20 2a 70 4d 65 72 67 65 72 20 3d 20 70 49 6e 63   *pMerger = pInc
105c0 72 2d 3e 70 4d 65 72 67 65 72 3b 0a 20 20 50 6d  r->pMerger;.  Pm
105d0 61 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a  aWriter writer;.
105e0 20 20 61 73 73 65 72 74 28 20 70 49 6e 63 72 2d    assert( pIncr-
105f0 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 0a 20 20 76  >bEof==0 );..  v
10600 64 62 65 53 6f 72 74 65 72 50 6f 70 75 6c 61 74  dbeSorterPopulat
10610 65 44 65 62 75 67 28 70 54 61 73 6b 2c 20 22 65  eDebug(pTask, "e
10620 6e 74 65 72 22 29 3b 0a 0a 20 20 76 64 62 65 50  nter");..  vdbeP
10630 6d 61 57 72 69 74 65 72 49 6e 69 74 28 70 4f 75  maWriterInit(pOu
10640 74 2d 3e 70 46 64 2c 20 26 77 72 69 74 65 72 2c  t->pFd, &writer,
10650 20 70 54 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d   pTask->pSorter-
10660 3e 70 67 73 7a 2c 20 69 53 74 61 72 74 29 3b 0a  >pgsz, iStart);.
10670 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
10680 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
10690 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20 50 6d 61  t dummy;.    Pma
106a0 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 20  Reader *pReader 
106b0 3d 20 26 70 4d 65 72 67 65 72 2d 3e 61 52 65 61  = &pMerger->aRea
106c0 64 72 5b 20 70 4d 65 72 67 65 72 2d 3e 61 54 72  dr[ pMerger->aTr
106d0 65 65 5b 31 5d 20 5d 3b 0a 20 20 20 20 69 6e 74  ee[1] ];.    int
106e0 20 6e 4b 65 79 20 3d 20 70 52 65 61 64 65 72 2d   nKey = pReader-
106f0 3e 6e 4b 65 79 3b 0a 20 20 20 20 69 36 34 20 69  >nKey;.    i64 i
10700 45 6f 66 20 3d 20 77 72 69 74 65 72 2e 69 57 72  Eof = writer.iWr
10710 69 74 65 4f 66 66 20 2b 20 77 72 69 74 65 72 2e  iteOff + writer.
10720 69 42 75 66 45 6e 64 3b 0a 0a 20 20 20 20 2f 2a  iBufEnd;..    /*
10730 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 6f 75   Check if the ou
10740 74 70 75 74 20 66 69 6c 65 20 69 73 20 66 75 6c  tput file is ful
10750 6c 20 6f 72 20 69 66 20 74 68 65 20 69 6e 70 75  l or if the inpu
10760 74 20 68 61 73 20 62 65 65 6e 20 65 78 68 61 75  t has been exhau
10770 73 74 65 64 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  sted..    ** In 
10780 65 69 74 68 65 72 20 63 61 73 65 20 65 78 69 74  either case exit
10790 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20   the loop. */.  
107a0 20 20 69 66 28 20 70 52 65 61 64 65 72 2d 3e 70    if( pReader->p
107b0 46 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  Fd==0 ) break;. 
107c0 20 20 20 69 66 28 20 28 69 45 6f 66 20 2b 20 6e     if( (iEof + n
107d0 4b 65 79 20 2b 20 73 71 6c 69 74 65 33 56 61 72  Key + sqlite3Var
107e0 69 6e 74 4c 65 6e 28 6e 4b 65 79 29 29 3e 28 69  intLen(nKey))>(i
107f0 53 74 61 72 74 20 2b 20 70 49 6e 63 72 2d 3e 6d  Start + pIncr->m
10800 78 53 7a 29 20 29 20 62 72 65 61 6b 3b 0a 0a 20  xSz) ) break;.. 
10810 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
10820 6e 65 78 74 20 6b 65 79 20 74 6f 20 74 68 65 20  next key to the 
10830 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 76  output. */.    v
10840 64 62 65 50 6d 61 57 72 69 74 65 56 61 72 69 6e  dbePmaWriteVarin
10850 74 28 26 77 72 69 74 65 72 2c 20 6e 4b 65 79 29  t(&writer, nKey)
10860 3b 0a 20 20 20 20 76 64 62 65 50 6d 61 57 72 69  ;.    vdbePmaWri
10870 74 65 42 6c 6f 62 28 26 77 72 69 74 65 72 2c 20  teBlob(&writer, 
10880 70 52 65 61 64 65 72 2d 3e 61 4b 65 79 2c 20 6e  pReader->aKey, n
10890 4b 65 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Key);.    assert
108a0 28 20 70 49 6e 63 72 2d 3e 70 4d 65 72 67 65 72  ( pIncr->pMerger
108b0 2d 3e 70 54 61 73 6b 3d 3d 70 54 61 73 6b 20 29  ->pTask==pTask )
108c0 3b 0a 20 20 20 20 72 63 20 3d 20 76 64 62 65 4d  ;.    rc = vdbeM
108d0 65 72 67 65 45 6e 67 69 6e 65 53 74 65 70 28 70  ergeEngineStep(p
108e0 49 6e 63 72 2d 3e 70 4d 65 72 67 65 72 2c 20 26  Incr->pMerger, &
108f0 64 75 6d 6d 79 29 3b 0a 20 20 7d 0a 0a 20 20 72  dummy);.  }..  r
10900 63 32 20 3d 20 76 64 62 65 50 6d 61 57 72 69 74  c2 = vdbePmaWrit
10910 65 72 46 69 6e 69 73 68 28 26 77 72 69 74 65 72  erFinish(&writer
10920 2c 20 26 70 4f 75 74 2d 3e 69 45 6f 66 29 3b 0a  , &pOut->iEof);.
10930 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10940 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
10950 20 20 76 64 62 65 53 6f 72 74 65 72 50 6f 70 75    vdbeSorterPopu
10960 6c 61 74 65 44 65 62 75 67 28 70 54 61 73 6b 2c  lateDebug(pTask,
10970 20 22 65 78 69 74 22 29 3b 0a 20 20 72 65 74 75   "exit");.  retu
10980 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51  rn rc;.}..#if SQ
10990 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
109a0 54 48 52 45 41 44 53 3e 30 0a 2f 2a 0a 2a 2a 20  THREADS>0./*.** 
109b0 54 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65  The main routine
109c0 20 66 6f 72 20 62 61 63 6b 67 72 6f 75 6e 64 20   for background 
109d0 74 68 72 65 61 64 73 20 74 68 61 74 20 70 6f 70  threads that pop
109e0 75 6c 61 74 65 20 61 46 69 6c 65 5b 31 5d 20 6f  ulate aFile[1] o
109f0 66 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68 72 65 61  f.** multi-threa
10a00 64 65 64 20 49 6e 63 72 4d 65 72 67 65 72 20 6f  ded IncrMerger o
10a10 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  bjects..*/.stati
10a20 63 20 76 6f 69 64 20 2a 76 64 62 65 49 6e 63 72  c void *vdbeIncr
10a30 50 6f 70 75 6c 61 74 65 54 68 72 65 61 64 28 76  PopulateThread(v
10a40 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20 20 49 6e  oid *pCtx){.  In
10a50 63 72 4d 65 72 67 65 72 20 2a 70 49 6e 63 72 20  crMerger *pIncr 
10a60 3d 20 28 49 6e 63 72 4d 65 72 67 65 72 2a 29 70  = (IncrMerger*)p
10a70 43 74 78 3b 0a 20 20 76 6f 69 64 20 2a 70 52 65  Ctx;.  void *pRe
10a80 74 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  t = SQLITE_INT_T
10a90 4f 5f 50 54 52 28 20 76 64 62 65 49 6e 63 72 50  O_PTR( vdbeIncrP
10aa0 6f 70 75 6c 61 74 65 28 70 49 6e 63 72 29 20 29  opulate(pIncr) )
10ab0 3b 0a 20 20 70 49 6e 63 72 2d 3e 70 54 61 73 6b  ;.  pIncr->pTask
10ac0 2d 3e 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 72  ->bDone = 1;.  r
10ad0 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
10ae0 2a 0a 2a 2a 20 4c 61 75 6e 63 68 20 61 20 62 61  *.** Launch a ba
10af0 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20  ckground thread 
10b00 74 6f 20 70 6f 70 75 6c 61 74 65 20 61 46 69 6c  to populate aFil
10b10 65 5b 31 5d 20 6f 66 20 70 49 6e 63 72 2e 0a 2a  e[1] of pIncr..*
10b20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
10b30 65 49 6e 63 72 42 67 50 6f 70 75 6c 61 74 65 28  eIncrBgPopulate(
10b40 49 6e 63 72 4d 65 72 67 65 72 20 2a 70 49 6e 63  IncrMerger *pInc
10b50 72 29 7b 0a 20 20 76 6f 69 64 20 2a 70 20 3d 20  r){.  void *p = 
10b60 28 76 6f 69 64 2a 29 70 49 6e 63 72 3b 0a 20 20  (void*)pIncr;.  
10b70 61 73 73 65 72 74 28 20 70 49 6e 63 72 2d 3e 62  assert( pIncr->b
10b80 55 73 65 54 68 72 65 61 64 20 29 3b 0a 20 20 72  UseThread );.  r
10b90 65 74 75 72 6e 20 76 64 62 65 53 6f 72 74 65 72  eturn vdbeSorter
10ba0 43 72 65 61 74 65 54 68 72 65 61 64 28 70 49 6e  CreateThread(pIn
10bb0 63 72 2d 3e 70 54 61 73 6b 2c 20 76 64 62 65 49  cr->pTask, vdbeI
10bc0 6e 63 72 50 6f 70 75 6c 61 74 65 54 68 72 65 61  ncrPopulateThrea
10bd0 64 2c 20 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  d, p);.}.#endif.
10be0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
10bf0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
10c00 68 65 6e 20 74 68 65 20 50 6d 61 52 65 61 64 65  hen the PmaReade
10c10 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
10c20 74 6f 20 70 49 6e 63 72 20 68 61 73 0a 2a 2a 20  to pIncr has.** 
10c30 66 69 6e 69 73 68 65 64 20 72 65 61 64 69 6e 67  finished reading
10c40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
10c50 20 61 46 69 6c 65 5b 30 5d 2e 20 49 74 73 20 70   aFile[0]. Its p
10c60 75 72 70 6f 73 65 20 69 73 20 74 6f 20 22 72 65  urpose is to "re
10c70 66 69 6c 6c 22 0a 2a 2a 20 61 46 69 6c 65 5b 30  fill".** aFile[0
10c80 5d 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  ] such that the 
10c90 50 6d 61 52 65 61 64 65 72 20 73 68 6f 75 6c 64  PmaReader should
10ca0 20 73 74 61 72 74 20 72 65 72 65 61 64 69 6e 67   start rereading
10cb0 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20   it from the.** 
10cc0 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  beginning..**.**
10cd0 20 46 6f 72 20 73 69 6e 67 6c 65 2d 74 68 72 65   For single-thre
10ce0 61 64 65 64 20 6f 62 6a 65 63 74 73 2c 20 74 68  aded objects, th
10cf0 69 73 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68  is is accomplish
10d00 65 64 20 62 79 20 6c 69 74 65 72 61 6c 6c 79 20  ed by literally 
10d10 72 65 61 64 69 6e 67 20 0a 2a 2a 20 6b 65 79 73  reading .** keys
10d20 20 66 72 6f 6d 20 70 49 6e 63 72 2d 3e 70 4d 65   from pIncr->pMe
10d30 72 67 65 72 20 61 6e 64 20 72 65 70 6f 70 75 6c  rger and repopul
10d40 61 74 69 6e 67 20 61 46 69 6c 65 5b 30 5d 2e 20  ating aFile[0]. 
10d50 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 75 6c 74 69  .**.** For multi
10d60 2d 74 68 72 65 61 64 65 64 20 6f 62 6a 65 63 74  -threaded object
10d70 73 2c 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  s, all that is r
10d80 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 77 61  equired is to wa
10d90 69 74 20 75 6e 74 69 6c 20 74 68 65 20 0a 2a 2a  it until the .**
10da0 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65   background thre
10db0 61 64 20 69 73 20 66 69 6e 69 73 68 65 64 20 28  ad is finished (
10dc0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
10dd0 65 61 64 79 29 20 61 6e 64 20 74 68 65 6e 20 73  eady) and then s
10de0 77 61 70 20 0a 2a 2a 20 61 46 69 6c 65 5b 30 5d  wap .** aFile[0]
10df0 20 61 6e 64 20 61 46 69 6c 65 5b 31 5d 20 69 6e   and aFile[1] in
10e00 20 70 6c 61 63 65 2e 20 49 66 20 74 68 65 20 63   place. If the c
10e10 6f 6e 74 65 6e 74 73 20 6f 66 20 70 4d 65 72 67  ontents of pMerg
10e20 65 72 20 68 61 76 65 20 6e 6f 74 0a 2a 2a 20 62  er have not.** b
10e30 65 65 6e 20 65 78 68 61 75 73 74 65 64 2c 20 74  een exhausted, t
10e40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73  his function als
10e50 6f 20 6c 61 75 6e 63 68 65 73 20 61 20 6e 65 77  o launches a new
10e60 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65   background thre
10e70 61 64 0a 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74  ad.** to populat
10e80 65 20 74 68 65 20 6e 65 77 20 61 46 69 6c 65 5b  e the new aFile[
10e90 31 5d 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  1]..**.** SQLITE
10ea0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
10eb0 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20 61  on success, or a
10ec0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
10ed0 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
10ee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
10ef0 65 49 6e 63 72 53 77 61 70 28 49 6e 63 72 4d 65  eIncrSwap(IncrMe
10f00 72 67 65 72 20 2a 70 49 6e 63 72 29 7b 0a 20 20  rger *pIncr){.  
10f10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10f20 4f 4b 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  OK;..#if SQLITE_
10f30 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
10f40 44 53 3e 30 0a 20 20 69 66 28 20 70 49 6e 63 72  DS>0.  if( pIncr
10f50 2d 3e 62 55 73 65 54 68 72 65 61 64 20 29 7b 0a  ->bUseThread ){.
10f60 20 20 20 20 72 63 20 3d 20 76 64 62 65 53 6f 72      rc = vdbeSor
10f70 74 65 72 4a 6f 69 6e 54 68 72 65 61 64 28 70 49  terJoinThread(pI
10f80 6e 63 72 2d 3e 70 54 61 73 6b 29 3b 0a 0a 20 20  ncr->pTask);..  
10f90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10fa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 53 6f 72  _OK ){.      Sor
10fb0 74 65 72 46 69 6c 65 20 66 30 20 3d 20 70 49 6e  terFile f0 = pIn
10fc0 63 72 2d 3e 61 46 69 6c 65 5b 30 5d 3b 0a 20 20  cr->aFile[0];.  
10fd0 20 20 20 20 70 49 6e 63 72 2d 3e 61 46 69 6c 65      pIncr->aFile
10fe0 5b 30 5d 20 3d 20 70 49 6e 63 72 2d 3e 61 46 69  [0] = pIncr->aFi
10ff0 6c 65 5b 31 5d 3b 0a 20 20 20 20 20 20 70 49 6e  le[1];.      pIn
11000 63 72 2d 3e 61 46 69 6c 65 5b 31 5d 20 3d 20 66  cr->aFile[1] = f
11010 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  0;.    }..    if
11020 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11030 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  ){.      if( pIn
11040 63 72 2d 3e 61 46 69 6c 65 5b 30 5d 2e 69 45 6f  cr->aFile[0].iEo
11050 66 3d 3d 70 49 6e 63 72 2d 3e 69 53 74 61 72 74  f==pIncr->iStart
11060 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Off ){.        p
11070 49 6e 63 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  Incr->bEof = 1;.
11080 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11090 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 49 6e       rc = vdbeIn
110a0 63 72 42 67 50 6f 70 75 6c 61 74 65 28 70 49 6e  crBgPopulate(pIn
110b0 63 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  cr);.      }.   
110c0 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
110d0 66 0a 20 20 7b 0a 20 20 20 20 72 63 20 3d 20 76  f.  {.    rc = v
110e0 64 62 65 49 6e 63 72 50 6f 70 75 6c 61 74 65 28  dbeIncrPopulate(
110f0 70 49 6e 63 72 29 3b 0a 20 20 20 20 70 49 6e 63  pIncr);.    pInc
11100 72 2d 3e 61 46 69 6c 65 5b 30 5d 20 3d 20 70 49  r->aFile[0] = pI
11110 6e 63 72 2d 3e 61 46 69 6c 65 5b 31 5d 3b 0a 20  ncr->aFile[1];. 
11120 20 20 20 69 66 28 20 70 49 6e 63 72 2d 3e 61 46     if( pIncr->aF
11130 69 6c 65 5b 30 5d 2e 69 45 6f 66 3d 3d 70 49 6e  ile[0].iEof==pIn
11140 63 72 2d 3e 69 53 74 61 72 74 4f 66 66 20 29 7b  cr->iStartOff ){
11150 0a 20 20 20 20 20 20 70 49 6e 63 72 2d 3e 62 45  .      pIncr->bE
11160 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  of = 1;.    }.  
11170 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
11180 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
11190 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e  e and return a n
111a0 65 77 20 49 6e 63 72 4d 65 72 67 65 72 20 6f 62  ew IncrMerger ob
111b0 6a 65 63 74 20 74 6f 20 72 65 61 64 20 64 61 74  ject to read dat
111c0 61 20 66 72 6f 6d 20 70 4d 65 72 67 65 72 2e 0a  a from pMerger..
111d0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
111e0 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e 63  condition is enc
111f0 6f 75 6e 74 65 72 65 64 2c 20 72 65 74 75 72 6e  ountered, return
11200 20 4e 55 4c 4c 2e 20 49 6e 20 74 68 69 73 20 63   NULL. In this c
11210 61 73 65 20 66 72 65 65 20 74 68 65 0a 2a 2a 20  ase free the.** 
11220 70 4d 65 72 67 65 72 20 61 72 67 75 6d 65 6e 74  pMerger argument
11230 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
11240 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
11250 20 76 64 62 65 49 6e 63 72 4d 65 72 67 65 72 4e   vdbeIncrMergerN
11260 65 77 28 0a 20 20 53 6f 72 74 53 75 62 74 61 73  ew(.  SortSubtas
11270 6b 20 2a 70 54 61 73 6b 2c 20 20 20 20 20 2f 2a  k *pTask,     /*
11280 20 54 68 65 20 74 68 72 65 61 64 20 74 68 61 74   The thread that
11290 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74   will be using t
112a0 68 65 20 6e 65 77 20 49 6e 63 72 4d 65 72 67 65  he new IncrMerge
112b0 72 20 2a 2f 0a 20 20 4d 65 72 67 65 45 6e 67 69  r */.  MergeEngi
112c0 6e 65 20 2a 70 4d 65 72 67 65 72 2c 20 20 20 2f  ne *pMerger,   /
112d0 2a 20 54 68 65 20 4d 65 72 67 65 45 6e 67 69 6e  * The MergeEngin
112e0 65 20 74 68 61 74 20 74 68 65 20 49 6e 63 72 4d  e that the IncrM
112f0 65 72 67 65 72 20 77 69 6c 6c 20 63 6f 6e 74 72  erger will contr
11300 6f 6c 20 2a 2f 0a 20 20 49 6e 63 72 4d 65 72 67  ol */.  IncrMerg
11310 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20  er **ppOut      
11320 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77  /* Write the new
11330 20 49 6e 63 72 4d 65 72 67 65 72 20 68 65 72 65   IncrMerger here
11340 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
11350 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 49  = SQLITE_OK;.  I
11360 6e 63 72 4d 65 72 67 65 72 20 2a 70 49 6e 63 72  ncrMerger *pIncr
11370 20 3d 20 2a 70 70 4f 75 74 20 3d 20 28 49 6e 63   = *ppOut = (Inc
11380 72 4d 65 72 67 65 72 2a 29 0a 20 20 20 20 20 20  rMerger*).      
11390 20 28 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69   (sqlite3FaultSi
113a0 6d 28 31 30 30 29 20 3f 20 30 20 3a 20 73 71 6c  m(100) ? 0 : sql
113b0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
113c0 69 7a 65 6f 66 28 2a 70 49 6e 63 72 29 29 29 3b  izeof(*pIncr)));
113d0 0a 20 20 69 66 28 20 70 49 6e 63 72 20 29 7b 0a  .  if( pIncr ){.
113e0 20 20 20 20 70 49 6e 63 72 2d 3e 70 4d 65 72 67      pIncr->pMerg
113f0 65 72 20 3d 20 70 4d 65 72 67 65 72 3b 0a 20 20  er = pMerger;.  
11400 20 20 70 49 6e 63 72 2d 3e 70 54 61 73 6b 20 3d    pIncr->pTask =
11410 20 70 54 61 73 6b 3b 0a 20 20 20 20 70 49 6e 63   pTask;.    pInc
11420 72 2d 3e 6d 78 53 7a 20 3d 20 4d 41 58 28 70 54  r->mxSz = MAX(pT
11430 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 6d 78  ask->pSorter->mx
11440 4b 65 79 73 69 7a 65 2b 39 2c 70 54 61 73 6b 2d  Keysize+9,pTask-
11450 3e 70 53 6f 72 74 65 72 2d 3e 6d 78 50 6d 61 53  >pSorter->mxPmaS
11460 69 7a 65 2f 32 29 3b 0a 20 20 20 20 70 54 61 73  ize/2);.    pTas
11470 6b 2d 3e 66 69 6c 65 32 2e 69 45 6f 66 20 2b 3d  k->file2.iEof +=
11480 20 70 49 6e 63 72 2d 3e 6d 78 53 7a 3b 0a 20 20   pIncr->mxSz;.  
11490 7d 65 6c 73 65 7b 0a 20 20 20 20 76 64 62 65 4d  }else{.    vdbeM
114a0 65 72 67 65 45 6e 67 69 6e 65 46 72 65 65 28 70  ergeEngineFree(p
114b0 4d 65 72 67 65 72 29 3b 0a 20 20 20 20 72 63 20  Merger);.    rc 
114c0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
114d0 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
114e0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  n rc;.}..#if SQL
114f0 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
11500 48 52 45 41 44 53 3e 30 0a 2f 2a 0a 2a 2a 20 53  HREADS>0./*.** S
11510 65 74 20 74 68 65 20 22 75 73 65 2d 74 68 72 65  et the "use-thre
11520 61 64 73 22 20 66 6c 61 67 20 6f 6e 20 6f 62 6a  ads" flag on obj
11530 65 63 74 20 70 49 6e 63 72 2e 0a 2a 2f 0a 73 74  ect pIncr..*/.st
11540 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e  atic void vdbeIn
11550 63 72 4d 65 72 67 65 72 53 65 74 54 68 72 65 61  crMergerSetThrea
11560 64 73 28 49 6e 63 72 4d 65 72 67 65 72 20 2a 70  ds(IncrMerger *p
11570 49 6e 63 72 29 7b 0a 20 20 70 49 6e 63 72 2d 3e  Incr){.  pIncr->
11580 62 55 73 65 54 68 72 65 61 64 20 3d 20 31 3b 0a  bUseThread = 1;.
11590 20 20 70 49 6e 63 72 2d 3e 70 54 61 73 6b 2d 3e    pIncr->pTask->
115a0 66 69 6c 65 32 2e 69 45 6f 66 20 2d 3d 20 70 49  file2.iEof -= pI
115b0 6e 63 72 2d 3e 6d 78 53 7a 3b 0a 7d 0a 23 65 6e  ncr->mxSz;.}.#en
115c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41  dif /* SQLITE_MA
115d0 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
115e0 3e 30 20 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 52  >0 */..../*.** R
115f0 65 63 6f 6d 70 75 74 65 20 70 4d 65 72 67 65 72  ecompute pMerger
11600 2d 3e 61 54 72 65 65 5b 69 4f 75 74 5d 20 62 79  ->aTree[iOut] by
11610 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6e   comparing the n
11620 65 78 74 20 6b 65 79 73 20 6f 6e 20 74 68 65 0a  ext keys on the.
11630 2a 2a 20 74 77 6f 20 50 6d 61 52 65 61 64 65 72  ** two PmaReader
11640 73 20 74 68 61 74 20 66 65 65 64 20 74 68 61 74  s that feed that
11650 20 65 6e 74 72 79 2e 20 20 4e 65 69 74 68 65 72   entry.  Neither
11660 20 6f 66 20 74 68 65 20 50 6d 61 52 65 61 64 65   of the PmaReade
11670 72 73 0a 2a 2a 20 61 72 65 20 61 64 76 61 6e 63  rs.** are advanc
11680 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
11690 65 20 6d 65 72 65 6c 79 20 64 6f 65 73 20 74 68  e merely does th
116a0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f  e comparison..*/
116b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
116c0 65 4d 65 72 67 65 45 6e 67 69 6e 65 43 6f 6d 70  eMergeEngineComp
116d0 61 72 65 28 0a 20 20 4d 65 72 67 65 45 6e 67 69  are(.  MergeEngi
116e0 6e 65 20 2a 70 4d 65 72 67 65 72 2c 20 20 2f 2a  ne *pMerger,  /*
116f0 20 4d 65 72 67 65 20 65 6e 67 69 6e 65 20 63 6f   Merge engine co
11700 6e 74 61 69 6e 69 6e 67 20 50 6d 61 52 65 61 64  ntaining PmaRead
11710 65 72 73 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  ers to compare *
11720 2f 0a 20 20 69 6e 74 20 69 4f 75 74 20 20 20 20  /.  int iOut    
11730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
11740 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
11750 6e 20 70 4d 65 72 67 65 72 2d 3e 61 54 72 65 65  n pMerger->aTree
11760 5b 69 4f 75 74 5d 20 2a 2f 0a 29 7b 0a 20 20 69  [iOut] */.){.  i
11770 6e 74 20 69 31 3b 0a 20 20 69 6e 74 20 69 32 3b  nt i1;.  int i2;
11780 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20 50  .  int iRes;.  P
11790 6d 61 52 65 61 64 65 72 20 2a 70 31 3b 0a 20 20  maReader *p1;.  
117a0 50 6d 61 52 65 61 64 65 72 20 2a 70 32 3b 0a 0a  PmaReader *p2;..
117b0 20 20 61 73 73 65 72 74 28 20 69 4f 75 74 3c 70    assert( iOut<p
117c0 4d 65 72 67 65 72 2d 3e 6e 54 72 65 65 20 26 26  Merger->nTree &&
117d0 20 69 4f 75 74 3e 30 20 29 3b 0a 0a 20 20 69 66   iOut>0 );..  if
117e0 28 20 69 4f 75 74 3e 3d 28 70 4d 65 72 67 65 72  ( iOut>=(pMerger
117f0 2d 3e 6e 54 72 65 65 2f 32 29 20 29 7b 0a 20 20  ->nTree/2) ){.  
11800 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d 20 70    i1 = (iOut - p
11810 4d 65 72 67 65 72 2d 3e 6e 54 72 65 65 2f 32 29  Merger->nTree/2)
11820 20 2a 20 32 3b 0a 20 20 20 20 69 32 20 3d 20 69   * 2;.    i2 = i
11830 31 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  1 + 1;.  }else{.
11840 20 20 20 20 69 31 20 3d 20 70 4d 65 72 67 65 72      i1 = pMerger
11850 2d 3e 61 54 72 65 65 5b 69 4f 75 74 2a 32 5d 3b  ->aTree[iOut*2];
11860 0a 20 20 20 20 69 32 20 3d 20 70 4d 65 72 67 65  .    i2 = pMerge
11870 72 2d 3e 61 54 72 65 65 5b 69 4f 75 74 2a 32 2b  r->aTree[iOut*2+
11880 31 5d 3b 0a 20 20 7d 0a 0a 20 20 70 31 20 3d 20  1];.  }..  p1 = 
11890 26 70 4d 65 72 67 65 72 2d 3e 61 52 65 61 64 72  &pMerger->aReadr
118a0 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70 4d  [i1];.  p2 = &pM
118b0 65 72 67 65 72 2d 3e 61 52 65 61 64 72 5b 69 32  erger->aReadr[i2
118c0 5d 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 46  ];..  if( p1->pF
118d0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 52 65 73  d==0 ){.    iRes
118e0 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20 69   = i2;.  }else i
118f0 66 28 20 70 32 2d 3e 70 46 64 3d 3d 30 20 29 7b  f( p2->pFd==0 ){
11900 0a 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a  .    iRes = i1;.
11910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 6f 72    }else{.    Sor
11920 74 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 20  tSubtask *pTask 
11930 3d 20 70 4d 65 72 67 65 72 2d 3e 70 54 61 73 6b  = pMerger->pTask
11940 3b 0a 20 20 20 20 69 6e 74 20 62 43 61 63 68 65  ;.    int bCache
11950 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  d = 0;.    int r
11960 65 73 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  es;.    assert( 
11970 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64  pTask->pUnpacked
11980 21 3d 30 20 29 3b 20 20 2f 2a 20 66 72 6f 6d 20  !=0 );  /* from 
11990 76 64 62 65 53 6f 72 74 53 75 62 74 61 73 6b 4d  vdbeSortSubtaskM
119a0 61 69 6e 28 29 20 2a 2f 0a 20 20 20 20 72 65 73  ain() */.    res
119b0 20 3d 20 70 54 61 73 6b 2d 3e 78 43 6f 6d 70 61   = pTask->xCompa
119c0 72 65 28 0a 20 20 20 20 20 20 20 20 70 54 61 73  re(.        pTas
119d0 6b 2c 20 26 62 43 61 63 68 65 64 2c 20 70 31 2d  k, &bCached, p1-
119e0 3e 61 4b 65 79 2c 20 70 31 2d 3e 6e 4b 65 79 2c  >aKey, p1->nKey,
119f0 20 70 32 2d 3e 61 4b 65 79 2c 20 70 32 2d 3e 6e   p2->aKey, p2->n
11a00 4b 65 79 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  Key.    );.    i
11a10 66 28 20 72 65 73 3c 3d 30 20 29 7b 0a 20 20 20  f( res<=0 ){.   
11a20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20     iRes = i1;.  
11a30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
11a40 52 65 73 20 3d 20 69 32 3b 0a 20 20 20 20 7d 0a  Res = i2;.    }.
11a50 20 20 7d 0a 0a 20 20 70 4d 65 72 67 65 72 2d 3e    }..  pMerger->
11a60 61 54 72 65 65 5b 69 4f 75 74 5d 20 3d 20 69 52  aTree[iOut] = iR
11a70 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  es;.}../*.** All
11a80 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20  owed values for 
11a90 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65  the eMode parame
11aa0 74 65 72 20 74 6f 20 76 64 62 65 4d 65 72 67 65  ter to vdbeMerge
11ab0 45 6e 67 69 6e 65 49 6e 69 74 28 29 0a 2a 2a 20  EngineInit().** 
11ac0 61 6e 64 20 76 64 62 65 50 6d 61 52 65 61 64 65  and vdbePmaReade
11ad0 72 49 6e 63 72 4d 65 72 67 65 49 6e 69 74 28 29  rIncrMergeInit()
11ae0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 49 4e 43  ..**.** Only INC
11af0 52 49 4e 49 54 5f 4e 4f 52 4d 41 4c 20 69 73 20  RINIT_NORMAL is 
11b00 76 61 6c 69 64 20 69 6e 20 73 69 6e 67 6c 65 2d  valid in single-
11b10 74 68 72 65 61 64 65 64 20 62 75 69 6c 64 73 20  threaded builds 
11b20 28 77 68 65 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  (when.** SQLITE_
11b30 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
11b40 44 53 3d 3d 30 29 2e 20 20 54 68 65 20 6f 74 68  DS==0).  The oth
11b50 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 6f 6e  er values are on
11b60 6c 79 20 75 73 65 64 0a 2a 2a 20 77 68 65 6e 20  ly used.** when 
11b70 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65  there exists one
11b80 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
11b90 65 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73  e worker threads
11ba0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4e 43  ..*/.#define INC
11bb0 52 49 4e 49 54 5f 4e 4f 52 4d 41 4c 20 30 0a 23  RINIT_NORMAL 0.#
11bc0 64 65 66 69 6e 65 20 49 4e 43 52 49 4e 49 54 5f  define INCRINIT_
11bd0 54 41 53 4b 20 20 20 31 0a 23 64 65 66 69 6e 65  TASK   1.#define
11be0 20 49 4e 43 52 49 4e 49 54 5f 52 4f 4f 54 20 20   INCRINIT_ROOT  
11bf0 20 32 0a 0a 2f 2a 20 0a 2a 2a 20 46 6f 72 77 61   2../* .** Forwa
11c00 72 64 20 72 65 66 65 72 65 6e 63 65 20 72 65 71  rd reference req
11c10 75 69 72 65 64 20 61 73 20 74 68 65 20 76 64 62  uired as the vdb
11c20 65 49 6e 63 72 4d 65 72 67 65 49 6e 69 74 28 29  eIncrMergeInit()
11c30 20 61 6e 64 0a 2a 2a 20 76 64 62 65 50 6d 61 52   and.** vdbePmaR
11c40 65 61 64 65 72 49 6e 63 72 49 6e 69 74 28 29 20  eaderIncrInit() 
11c50 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c  routines are cal
11c60 6c 65 64 20 6d 75 74 75 61 6c 6c 79 20 72 65 63  led mutually rec
11c70 75 72 73 69 76 65 6c 79 20 77 68 65 6e 0a 2a 2a  ursively when.**
11c80 20 62 75 69 6c 64 69 6e 67 20 61 20 6d 65 72 67   building a merg
11c90 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  e tree..*/.stati
11ca0 63 20 69 6e 74 20 76 64 62 65 50 6d 61 52 65 61  c int vdbePmaRea
11cb0 64 65 72 49 6e 63 72 49 6e 69 74 28 50 6d 61 52  derIncrInit(PmaR
11cc0 65 61 64 65 72 20 2a 70 52 65 61 64 72 2c 20 69  eader *pReadr, i
11cd0 6e 74 20 65 4d 6f 64 65 29 3b 0a 0a 2f 2a 0a 2a  nt eMode);../*.*
11ce0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
11cf0 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 6f 62 6a   MergeEngine obj
11d00 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
11d10 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
11d20 74 2e 20 4f 6e 63 65 20 74 68 69 73 0a 2a 2a 20  t. Once this.** 
11d30 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
11d40 2c 20 74 68 65 20 66 69 72 73 74 20 6b 65 79 20  , the first key 
11d50 6f 66 20 6d 65 72 67 65 64 20 64 61 74 61 20 6d  of merged data m
11d60 61 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ay be read from 
11d70 74 68 65 20 0a 2a 2a 20 4d 65 72 67 65 45 6e 67  the .** MergeEng
11d80 69 6e 65 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ine object in th
11d90 65 20 75 73 75 61 6c 20 66 61 73 68 69 6f 6e 2e  e usual fashion.
11da0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
11db0 6e 74 20 65 4d 6f 64 65 20 69 73 20 49 4e 43 52  nt eMode is INCR
11dc0 49 4e 49 54 5f 52 4f 4f 54 2c 20 74 68 65 6e 20  INIT_ROOT, then 
11dd0 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
11de0 61 74 20 61 6e 79 20 49 6e 63 72 4d 65 72 67 65  at any IncrMerge
11df0 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 61 74 74 61  .** objects atta
11e00 63 68 65 64 20 74 6f 20 74 68 65 20 50 6d 61 52  ched to the PmaR
11e10 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20 74 68  eader objects th
11e20 61 74 20 74 68 65 20 6d 65 72 67 65 72 20 72 65  at the merger re
11e30 61 64 73 20 66 72 6f 6d 20 68 61 76 65 0a 2a 2a  ads from have.**
11e40 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6f   already been po
11e50 70 75 6c 61 74 65 64 2c 20 62 75 74 20 74 68 61  pulated, but tha
11e60 74 20 74 68 65 79 20 68 61 76 65 20 6e 6f 74 20  t they have not 
11e70 79 65 74 20 70 6f 70 75 6c 61 74 65 64 20 61 46  yet populated aF
11e80 69 6c 65 5b 30 5d 20 61 6e 64 0a 2a 2a 20 73 65  ile[0] and.** se
11e90 74 20 74 68 65 20 50 6d 61 52 65 61 64 65 72 20  t the PmaReader 
11ea0 6f 62 6a 65 63 74 73 20 75 70 20 74 6f 20 72 65  objects up to re
11eb0 61 64 20 66 72 6f 6d 20 69 74 2e 20 49 6e 20 74  ad from it. In t
11ec0 68 69 73 20 63 61 73 65 20 61 6c 6c 20 74 68 61  his case all tha
11ed0 74 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64  t is.** required
11ee0 20 69 73 20 74 6f 20 63 61 6c 6c 20 76 64 62 65   is to call vdbe
11ef0 50 6d 61 52 65 61 64 65 72 4e 65 78 74 28 29 20  PmaReaderNext() 
11f00 6f 6e 20 65 61 63 68 20 50 6d 61 52 65 61 64 65  on each PmaReade
11f10 72 20 74 6f 20 70 6f 69 6e 74 20 69 74 20 61 74  r to point it at
11f20 0a 2a 2a 20 69 74 73 20 66 69 72 73 74 20 6b 65  .** its first ke
11f30 79 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  y..**.** Otherwi
11f40 73 65 2c 20 69 66 20 65 4d 6f 64 65 20 69 73 20  se, if eMode is 
11f50 61 6e 79 20 76 61 6c 75 65 20 6f 74 68 65 72 20  any value other 
11f60 74 68 61 6e 20 49 4e 43 52 49 4e 49 54 5f 52 4f  than INCRINIT_RO
11f70 4f 54 2c 20 74 68 65 6e 20 75 73 65 20 0a 2a 2a  OT, then use .**
11f80 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 49 6e   vdbePmaReaderIn
11f90 63 72 4d 65 72 67 65 49 6e 69 74 28 29 20 74 6f  crMergeInit() to
11fa0 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 61 63 68   initialize each
11fb0 20 50 6d 61 52 65 61 64 65 72 20 74 68 61 74 20   PmaReader that 
11fc0 66 65 65 64 73 20 64 61 74 61 20 0a 2a 2a 20 74  feeds data .** t
11fd0 6f 20 70 4d 65 72 67 65 72 2e 0a 2a 2a 0a 2a 2a  o pMerger..**.**
11fe0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
11ff0 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73  turned if succes
12000 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
12010 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
12020 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
12030 69 63 20 69 6e 74 20 76 64 62 65 4d 65 72 67 65  ic int vdbeMerge
12040 45 6e 67 69 6e 65 49 6e 69 74 28 0a 20 20 53 6f  EngineInit(.  So
12050 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b  rtSubtask *pTask
12060 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
12070 20 54 68 72 65 61 64 20 74 68 61 74 20 77 69 6c   Thread that wil
12080 6c 20 72 75 6e 20 70 4d 65 72 67 65 72 20 2a 2f  l run pMerger */
12090 0a 20 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 2a  .  MergeEngine *
120a0 70 4d 65 72 67 65 72 2c 20 20 20 20 20 20 20 20  pMerger,        
120b0 20 20 20 2f 2a 20 4d 65 72 67 65 45 6e 67 69 6e     /* MergeEngin
120c0 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
120d0 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 20 20  */.  int eMode  
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
12100 68 65 20 49 4e 43 52 49 4e 49 54 5f 58 58 58 20  he INCRINIT_XXX 
12110 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a  constants */.){.
12120 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12130 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
12140 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
12150 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12170 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
12180 70 69 6e 67 20 6f 76 65 72 20 50 6d 61 52 65 61  ping over PmaRea
12190 64 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  der objects */. 
121a0 20 69 6e 74 20 6e 54 72 65 65 20 3d 20 70 4d 65   int nTree = pMe
121b0 72 67 65 72 2d 3e 6e 54 72 65 65 3b 0a 0a 20 20  rger->nTree;..  
121c0 2f 2a 20 65 4d 6f 64 65 20 69 73 20 61 6c 77 61  /* eMode is alwa
121d0 79 73 20 49 4e 43 52 49 4e 49 54 5f 4e 4f 52 4d  ys INCRINIT_NORM
121e0 41 4c 20 69 6e 20 73 69 6e 67 6c 65 2d 74 68 72  AL in single-thr
121f0 65 61 64 65 64 20 6d 6f 64 65 20 2a 2f 0a 20 20  eaded mode */.  
12200 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4d  assert( SQLITE_M
12210 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
12220 53 3e 30 20 7c 7c 20 65 4d 6f 64 65 3d 3d 49 4e  S>0 || eMode==IN
12230 43 52 49 4e 49 54 5f 4e 4f 52 4d 41 4c 20 29 3b  CRINIT_NORMAL );
12240 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  ..  /* Verify th
12250 61 74 20 74 68 65 20 4d 65 72 67 65 45 6e 67 69  at the MergeEngi
12260 6e 65 20 69 73 20 61 73 73 69 67 6e 65 64 20 74  ne is assigned t
12270 6f 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61  o a single threa
12280 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  d */.  assert( p
12290 4d 65 72 67 65 72 2d 3e 70 54 61 73 6b 3d 3d 30  Merger->pTask==0
122a0 20 29 3b 0a 20 20 70 4d 65 72 67 65 72 2d 3e 70   );.  pMerger->p
122b0 54 61 73 6b 20 3d 20 70 54 61 73 6b 3b 0a 0a 20  Task = pTask;.. 
122c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 72 65   for(i=0; i<nTre
122d0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  e; i++){.    if(
122e0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
122f0 45 52 5f 54 48 52 45 41 44 53 3e 30 20 26 26 20  ER_THREADS>0 && 
12300 65 4d 6f 64 65 3d 3d 49 4e 43 52 49 4e 49 54 5f  eMode==INCRINIT_
12310 52 4f 4f 54 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ROOT ){.      /*
12320 20 50 6d 61 52 65 61 64 65 72 73 20 73 68 6f 75   PmaReaders shou
12330 6c 64 20 62 65 20 6e 6f 72 6d 61 6c 6c 79 20 69  ld be normally i
12340 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 6f 72  nitialized in or
12350 64 65 72 2c 20 61 73 20 69 66 20 74 68 65 79 20  der, as if they 
12360 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  are.      ** rea
12370 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 73 61  ding from the sa
12380 6d 65 20 74 65 6d 70 20 66 69 6c 65 20 74 68 69  me temp file thi
12390 73 20 6d 61 6b 65 73 20 66 6f 72 20 6d 6f 72 65  s makes for more
123a0 20 6c 69 6e 65 61 72 20 66 69 6c 65 20 49 4f 2e   linear file IO.
123b0 0a 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65  .      ** Howeve
123c0 72 2c 20 69 6e 20 74 68 65 20 49 4e 43 52 49 4e  r, in the INCRIN
123d0 49 54 5f 52 4f 4f 54 20 63 61 73 65 2c 20 69 66  IT_ROOT case, if
123e0 20 50 6d 61 52 65 61 64 65 72 20 61 52 65 61 64   PmaReader aRead
123f0 72 5b 6e 54 61 73 6b 2d 31 5d 20 69 73 0a 20 20  r[nTask-1] is.  
12400 20 20 20 20 2a 2a 20 69 6e 20 75 73 65 20 69 74      ** in use it
12410 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 65 20   will block the 
12420 76 64 62 65 50 6d 61 52 65 61 64 65 72 4e 65 78  vdbePmaReaderNex
12430 74 28 29 20 63 61 6c 6c 20 77 68 69 6c 65 20 69  t() call while i
12440 74 20 75 73 65 73 0a 20 20 20 20 20 20 2a 2a 20  t uses.      ** 
12450 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64 20  the main thread 
12460 74 6f 20 66 69 6c 6c 20 69 74 73 20 62 75 66 66  to fill its buff
12470 65 72 2e 20 53 6f 20 63 61 6c 6c 69 6e 67 20 50  er. So calling P
12480 6d 61 52 65 61 64 65 72 4e 65 78 74 28 29 0a 20  maReaderNext(). 
12490 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20       ** on this 
124a0 50 6d 61 52 65 61 64 65 72 20 62 65 66 6f 72 65  PmaReader before
124b0 20 61 6e 79 20 6f 66 20 74 68 65 20 6d 75 6c 74   any of the mult
124c0 69 2d 74 68 72 65 61 64 65 64 20 50 6d 61 52 65  i-threaded PmaRe
124d0 61 64 65 72 73 20 74 61 6b 65 73 0a 20 20 20 20  aders takes.    
124e0 20 20 2a 2a 20 62 65 74 74 65 72 20 61 64 76 61    ** better adva
124f0 6e 74 61 67 65 20 6f 66 20 6d 75 6c 74 69 2d 70  ntage of multi-p
12500 72 6f 63 65 73 73 6f 72 20 68 61 72 64 77 61 72  rocessor hardwar
12510 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  e. */.      rc =
12520 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 4e 65   vdbePmaReaderNe
12530 78 74 28 26 70 4d 65 72 67 65 72 2d 3e 61 52 65  xt(&pMerger->aRe
12540 61 64 72 5b 6e 54 72 65 65 2d 69 2d 31 5d 29 3b  adr[nTree-i-1]);
12550 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12560 20 20 72 63 20 3d 20 76 64 62 65 50 6d 61 52 65    rc = vdbePmaRe
12570 61 64 65 72 49 6e 63 72 49 6e 69 74 28 26 70 4d  aderIncrInit(&pM
12580 65 72 67 65 72 2d 3e 61 52 65 61 64 72 5b 69 5d  erger->aReadr[i]
12590 2c 20 49 4e 43 52 49 4e 49 54 5f 4e 4f 52 4d 41  , INCRINIT_NORMA
125a0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  L);.    }.    if
125b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
125c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
125d0 0a 0a 20 20 66 6f 72 28 69 3d 70 4d 65 72 67 65  ..  for(i=pMerge
125e0 72 2d 3e 6e 54 72 65 65 2d 31 3b 20 69 3e 30 3b  r->nTree-1; i>0;
125f0 20 69 2d 2d 29 7b 0a 20 20 20 20 76 64 62 65 4d   i--){.    vdbeM
12600 65 72 67 65 45 6e 67 69 6e 65 43 6f 6d 70 61 72  ergeEngineCompar
12610 65 28 70 4d 65 72 67 65 72 2c 20 69 29 3b 0a 20  e(pMerger, i);. 
12620 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 73   }.  return pTas
12630 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 2d 3e 65 72  k->pUnpacked->er
12640 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rCode;.}../*.** 
12650 54 68 65 20 50 6d 61 52 65 61 64 65 72 20 70 61  The PmaReader pa
12660 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
12670 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 67 75  t argument is gu
12680 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
12690 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c  n.** incremental
126a0 2d 72 65 61 64 65 72 20 28 70 52 65 61 64 72 2d  -reader (pReadr-
126b0 3e 70 49 6e 63 72 21 3d 30 29 2e 20 54 68 69 73  >pIncr!=0). This
126c0 20 66 75 6e 63 74 69 6f 6e 20 73 65 72 76 65 73   function serves
126d0 20 74 6f 20 6f 70 65 6e 0a 2a 2a 20 61 6e 64 2f   to open.** and/
126e0 6f 72 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  or initialize th
126f0 65 20 74 65 6d 70 20 66 69 6c 65 20 72 65 6c 61  e temp file rela
12700 74 65 64 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ted fields of th
12710 65 20 49 6e 63 72 4d 65 72 67 65 0a 2a 2a 20 6f  e IncrMerge.** o
12720 62 6a 65 63 74 20 61 74 20 28 70 52 65 61 64 72  bject at (pReadr
12730 2d 3e 70 49 6e 63 72 29 2e 0a 2a 2a 0a 2a 2a 20  ->pIncr)..**.** 
12740 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4d 6f 64  If argument eMod
12750 65 20 69 73 20 73 65 74 20 74 6f 20 49 4e 43 52  e is set to INCR
12760 49 4e 49 54 5f 4e 4f 52 4d 41 4c 2c 20 74 68 65  INIT_NORMAL, the
12770 6e 20 61 6c 6c 20 50 6d 61 52 65 61 64 65 72 73  n all PmaReaders
12780 0a 2a 2a 20 69 6e 20 74 68 65 20 73 75 62 2d 74  .** in the sub-t
12790 72 65 65 20 68 65 61 64 65 64 20 62 79 20 70 52  ree headed by pR
127a0 65 61 64 72 20 61 72 65 20 61 6c 73 6f 20 69 6e  eadr are also in
127b0 69 74 69 61 6c 69 7a 65 64 2e 20 44 61 74 61 20  itialized. Data 
127c0 69 73 20 74 68 65 6e 20 0a 2a 2a 20 6c 6f 61 64  is then .** load
127d0 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  ed into the buff
127e0 65 72 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  ers belonging to
127f0 20 70 52 65 61 64 72 20 61 6e 64 20 69 74 20 69   pReadr and it i
12800 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
12810 6f 20 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  o .** the first 
12820 6b 65 79 20 69 6e 20 69 74 73 20 72 61 6e 67 65  key in its range
12830 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
12840 65 6e 74 20 65 4d 6f 64 65 20 69 73 20 73 65 74  ent eMode is set
12850 20 74 6f 20 49 4e 43 52 49 4e 49 54 5f 54 41 53   to INCRINIT_TAS
12860 4b 2c 20 74 68 65 6e 20 70 52 65 61 64 72 20 69  K, then pReadr i
12870 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
12880 74 6f 20 62 65 20 61 20 6d 75 6c 74 69 2d 74 68  to be a multi-th
12890 72 65 61 64 65 64 20 50 6d 61 52 65 61 64 65 72  readed PmaReader
128a0 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
128b0 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
128c0 65 64 20 69 6e 20 61 0a 2a 2a 20 62 61 63 6b 67  ed in a.** backg
128d0 72 6f 75 6e 64 20 74 68 72 65 61 64 2e 20 49 6e  round thread. In
128e0 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 50   this case all P
128f0 6d 61 52 65 61 64 65 72 73 20 69 6e 20 74 68 65  maReaders in the
12900 20 73 75 62 2d 74 72 65 65 20 61 72 65 20 0a 2a   sub-tree are .*
12910 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 73  * initialized as
12920 20 66 6f 72 20 49 4e 43 52 49 4e 49 54 5f 4e 4f   for INCRINIT_NO
12930 52 4d 41 4c 20 61 6e 64 20 74 68 65 20 61 46 69  RMAL and the aFi
12940 6c 65 5b 31 5d 20 62 75 66 66 65 72 20 62 65 6c  le[1] buffer bel
12950 6f 6e 67 69 6e 67 20 74 6f 0a 2a 2a 20 70 52 65  onging to.** pRe
12960 61 64 72 20 69 73 20 70 6f 70 75 6c 61 74 65 64  adr is populated
12970 2e 20 48 6f 77 65 76 65 72 2c 20 70 52 65 61 64  . However, pRead
12980 72 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20  r itself is not 
12990 73 65 74 20 75 70 20 74 6f 20 70 6f 69 6e 74 0a  set up to point.
129a0 2a 2a 20 74 6f 20 69 74 73 20 66 69 72 73 74 20  ** to its first 
129b0 6b 65 79 2e 20 41 20 63 61 6c 6c 20 74 6f 20 76  key. A call to v
129c0 64 62 65 50 6d 61 52 65 61 64 65 72 4e 65 78 74  dbePmaReaderNext
129d0 28 29 20 69 73 20 73 74 69 6c 6c 20 72 65 71 75  () is still requ
129e0 69 72 65 64 20 74 6f 20 64 6f 0a 2a 2a 20 74 68  ired to do.** th
129f0 61 74 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  at. .**.** The r
12a00 65 61 73 6f 6e 20 74 68 69 73 20 66 75 6e 63 74  eason this funct
12a10 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 61 6c  ion does not cal
12a20 6c 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 4e  l vdbePmaReaderN
12a30 65 78 74 28 29 20 69 6d 6d 65 64 69 61 74 65 6c  ext() immediatel
12a40 79 20 0a 2a 2a 20 69 6e 20 74 68 65 20 49 4e 43  y .** in the INC
12a50 52 49 4e 49 54 5f 54 41 53 4b 20 63 61 73 65 20  RINIT_TASK case 
12a60 69 73 20 74 68 61 74 20 76 64 62 65 50 6d 61 52  is that vdbePmaR
12a70 65 61 64 65 72 4e 65 78 74 28 29 20 61 73 73 75  eaderNext() assu
12a80 6d 65 73 20 74 68 61 74 20 69 74 20 68 61 73 0a  mes that it has.
12a90 2a 2a 20 74 6f 20 62 6c 6f 63 6b 20 6f 6e 20 74  ** to block on t
12aa0 68 72 65 61 64 20 28 70 54 61 73 6b 2d 3e 74 68  hread (pTask->th
12ab0 72 65 61 64 29 20 62 65 66 6f 72 65 20 61 63 63  read) before acc
12ac0 65 73 73 69 6e 67 20 61 46 69 6c 65 5b 31 5d 2e  essing aFile[1].
12ad0 20 42 75 74 2c 20 73 69 6e 63 65 0a 2a 2a 20 74   But, since.** t
12ae0 68 69 73 20 65 6e 74 69 72 65 20 66 75 6e 63 74  his entire funct
12af0 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 75 6e  ion is being run
12b00 20 62 79 20 74 68 72 65 61 64 20 28 70 54 61 73   by thread (pTas
12b10 6b 2d 3e 74 68 72 65 61 64 29 2c 20 74 68 61 74  k->thread), that
12b20 20 77 69 6c 6c 0a 2a 2a 20 6c 65 61 64 20 74 6f   will.** lead to
12b30 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 61 63   the current bac
12b40 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 61  kground thread a
12b50 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6a 6f 69  ttempting to joi
12b60 6e 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  n itself..**.** 
12b70 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 72 67 75  Finally, if argu
12b80 6d 65 6e 74 20 65 4d 6f 64 65 20 69 73 20 73 65  ment eMode is se
12b90 74 20 74 6f 20 49 4e 43 52 49 4e 49 54 5f 52 4f  t to INCRINIT_RO
12ba0 4f 54 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  OT, it may be as
12bb0 73 75 6d 65 64 0a 2a 2a 20 74 68 61 74 20 70 52  sumed.** that pR
12bc0 65 61 64 72 2d 3e 70 49 6e 63 72 20 69 73 20 61  eadr->pIncr is a
12bd0 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20   multi-threaded 
12be0 49 6e 63 72 4d 65 72 67 65 20 6f 62 6a 65 63 74  IncrMerge object
12bf0 73 2c 20 61 6e 64 20 74 68 61 74 20 61 6c 6c 0a  s, and that all.
12c00 2a 2a 20 63 68 69 6c 64 2d 74 72 65 65 73 20 68  ** child-trees h
12c10 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
12c20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69   initialized usi
12c30 6e 67 20 49 6e 63 72 49 6e 69 74 28 49 4e 43 52  ng IncrInit(INCR
12c40 49 4e 49 54 5f 54 41 53 4b 29 2e 0a 2a 2a 20 49  INIT_TASK)..** I
12c50 6e 20 74 68 69 73 20 63 61 73 65 20 76 64 62 65  n this case vdbe
12c60 50 6d 61 52 65 61 64 65 72 4e 65 78 74 28 29 20  PmaReaderNext() 
12c70 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6c 6c  is called on all
12c80 20 63 68 69 6c 64 20 50 6d 61 52 65 61 64 65 72   child PmaReader
12c90 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  s and.** the cur
12ca0 72 65 6e 74 20 50 6d 61 52 65 61 64 65 72 20 73  rent PmaReader s
12cb0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
12cc0 68 65 20 66 69 72 73 74 20 6b 65 79 20 69 6e 20  he first key in 
12cd0 69 74 73 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a  its range..**.**
12ce0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
12cf0 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73  turned if succes
12d00 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
12d10 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
12d20 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
12d30 69 63 20 69 6e 74 20 76 64 62 65 50 6d 61 52 65  ic int vdbePmaRe
12d40 61 64 65 72 49 6e 63 72 4d 65 72 67 65 49 6e 69  aderIncrMergeIni
12d50 74 28 50 6d 61 52 65 61 64 65 72 20 2a 70 52 65  t(PmaReader *pRe
12d60 61 64 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  adr, int eMode){
12d70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12d80 54 45 5f 4f 4b 3b 0a 20 20 49 6e 63 72 4d 65 72  TE_OK;.  IncrMer
12d90 67 65 72 20 2a 70 49 6e 63 72 20 3d 20 70 52 65  ger *pIncr = pRe
12da0 61 64 72 2d 3e 70 49 6e 63 72 3b 0a 20 20 53 6f  adr->pIncr;.  So
12db0 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b  rtSubtask *pTask
12dc0 20 3d 20 70 49 6e 63 72 2d 3e 70 54 61 73 6b 3b   = pIncr->pTask;
12dd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
12de0 20 70 54 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d   pTask->pSorter-
12df0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 65 4d 6f 64 65  >db;..  /* eMode
12e00 20 69 73 20 61 6c 77 61 79 73 20 49 4e 43 52 49   is always INCRI
12e10 4e 49 54 5f 4e 4f 52 4d 41 4c 20 69 6e 20 73 69  NIT_NORMAL in si
12e20 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20 6d 6f  ngle-threaded mo
12e30 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  de */.  assert( 
12e40 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
12e50 52 5f 54 48 52 45 41 44 53 3e 30 20 7c 7c 20 65  R_THREADS>0 || e
12e60 4d 6f 64 65 3d 3d 49 4e 43 52 49 4e 49 54 5f 4e  Mode==INCRINIT_N
12e70 4f 52 4d 41 4c 20 29 3b 0a 0a 20 20 72 63 20 3d  ORMAL );..  rc =
12e80 20 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e 65   vdbeMergeEngine
12e90 49 6e 69 74 28 70 54 61 73 6b 2c 20 70 49 6e 63  Init(pTask, pInc
12ea0 72 2d 3e 70 4d 65 72 67 65 72 2c 20 65 4d 6f 64  r->pMerger, eMod
12eb0 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70  e);..  /* Set up
12ec0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 66 69   the required fi
12ed0 6c 65 73 20 66 6f 72 20 70 49 6e 63 72 2e 20 41  les for pIncr. A
12ee0 20 6d 75 6c 74 69 2d 74 68 65 61 64 65 64 20 49   multi-theaded I
12ef0 6e 63 72 4d 65 72 67 65 20 6f 62 6a 65 63 74 0a  ncrMerge object.
12f00 20 20 2a 2a 20 72 65 71 75 69 72 65 73 20 74 77    ** requires tw
12f10 6f 20 74 65 6d 70 20 66 69 6c 65 73 20 74 6f 20  o temp files to 
12f20 69 74 73 65 6c 66 2c 20 77 68 65 72 65 61 73 20  itself, whereas 
12f30 61 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65  a single-threade
12f40 64 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 6f 6e  d object.  ** on
12f50 6c 79 20 72 65 71 75 69 72 65 73 20 61 20 72 65  ly requires a re
12f60 67 69 6f 6e 20 6f 66 20 70 54 61 73 6b 2d 3e 66  gion of pTask->f
12f70 69 6c 65 32 2e 20 2a 2f 0a 20 20 69 66 28 20 72  ile2. */.  if( r
12f80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12f90 20 20 20 20 69 6e 74 20 6d 78 53 7a 20 3d 20 70      int mxSz = p
12fa0 49 6e 63 72 2d 3e 6d 78 53 7a 3b 0a 23 69 66 20  Incr->mxSz;.#if 
12fb0 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
12fc0 52 5f 54 48 52 45 41 44 53 3e 30 0a 20 20 20 20  R_THREADS>0.    
12fd0 69 66 28 20 70 49 6e 63 72 2d 3e 62 55 73 65 54  if( pIncr->bUseT
12fe0 68 72 65 61 64 20 29 7b 0a 20 20 20 20 20 20 72  hread ){.      r
12ff0 63 20 3d 20 76 64 62 65 53 6f 72 74 65 72 4f 70  c = vdbeSorterOp
13000 65 6e 54 65 6d 70 46 69 6c 65 28 64 62 2c 20 6d  enTempFile(db, m
13010 78 53 7a 2c 20 26 70 49 6e 63 72 2d 3e 61 46 69  xSz, &pIncr->aFi
13020 6c 65 5b 30 5d 2e 70 46 64 29 3b 0a 20 20 20 20  le[0].pFd);.    
13030 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13040 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
13050 63 20 3d 20 76 64 62 65 53 6f 72 74 65 72 4f 70  c = vdbeSorterOp
13060 65 6e 54 65 6d 70 46 69 6c 65 28 64 62 2c 20 6d  enTempFile(db, m
13070 78 53 7a 2c 20 26 70 49 6e 63 72 2d 3e 61 46 69  xSz, &pIncr->aFi
13080 6c 65 5b 31 5d 2e 70 46 64 29 3b 0a 20 20 20 20  le[1].pFd);.    
13090 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65    }.    }else.#e
130a0 6e 64 69 66 0a 20 20 20 20 2f 2a 69 66 28 20 21  ndif.    /*if( !
130b0 70 49 6e 63 72 2d 3e 62 55 73 65 54 68 72 65 61  pIncr->bUseThrea
130c0 64 20 29 2a 2f 7b 0a 20 20 20 20 20 20 69 66 28  d )*/{.      if(
130d0 20 70 54 61 73 6b 2d 3e 66 69 6c 65 32 2e 70 46   pTask->file2.pF
130e0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
130f0 61 73 73 65 72 74 28 20 70 54 61 73 6b 2d 3e 66  assert( pTask->f
13100 69 6c 65 32 2e 69 45 6f 66 3e 30 20 29 3b 0a 20  ile2.iEof>0 );. 
13110 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
13120 53 6f 72 74 65 72 4f 70 65 6e 54 65 6d 70 46 69  SorterOpenTempFi
13130 6c 65 28 64 62 2c 20 70 54 61 73 6b 2d 3e 66 69  le(db, pTask->fi
13140 6c 65 32 2e 69 45 6f 66 2c 20 26 70 54 61 73 6b  le2.iEof, &pTask
13150 2d 3e 66 69 6c 65 32 2e 70 46 64 29 3b 0a 20 20  ->file2.pFd);.  
13160 20 20 20 20 20 20 70 54 61 73 6b 2d 3e 66 69 6c        pTask->fil
13170 65 32 2e 69 45 6f 66 20 3d 20 30 3b 0a 20 20 20  e2.iEof = 0;.   
13180 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
13190 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
131a0 20 20 20 20 20 20 20 20 70 49 6e 63 72 2d 3e 61          pIncr->a
131b0 46 69 6c 65 5b 31 5d 2e 70 46 64 20 3d 20 70 54  File[1].pFd = pT
131c0 61 73 6b 2d 3e 66 69 6c 65 32 2e 70 46 64 3b 0a  ask->file2.pFd;.
131d0 20 20 20 20 20 20 20 20 70 49 6e 63 72 2d 3e 69          pIncr->i
131e0 53 74 61 72 74 4f 66 66 20 3d 20 70 54 61 73 6b  StartOff = pTask
131f0 2d 3e 66 69 6c 65 32 2e 69 45 6f 66 3b 0a 20 20  ->file2.iEof;.  
13200 20 20 20 20 20 20 70 54 61 73 6b 2d 3e 66 69 6c        pTask->fil
13210 65 32 2e 69 45 6f 66 20 2b 3d 20 6d 78 53 7a 3b  e2.iEof += mxSz;
13220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13230 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d   }..#if SQLITE_M
13240 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
13250 53 3e 30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  S>0.  if( rc==SQ
13260 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 6e 63 72  LITE_OK && pIncr
13270 2d 3e 62 55 73 65 54 68 72 65 61 64 20 29 7b 0a  ->bUseThread ){.
13280 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 63      /* Use the c
13290 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 74 6f  urrent thread to
132a0 20 70 6f 70 75 6c 61 74 65 20 61 46 69 6c 65 5b   populate aFile[
132b0 31 5d 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  1], even though 
132c0 74 68 69 73 0a 20 20 20 20 2a 2a 20 50 6d 61 52  this.    ** PmaR
132d0 65 61 64 65 72 20 69 73 20 6d 75 6c 74 69 2d 74  eader is multi-t
132e0 68 72 65 61 64 65 64 2e 20 49 66 20 74 68 69 73  hreaded. If this
132f0 20 69 73 20 61 6e 20 49 4e 43 52 49 4e 49 54 5f   is an INCRINIT_
13300 54 41 53 4b 20 6f 62 6a 65 63 74 2c 0a 20 20 20  TASK object,.   
13310 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75   ** then this fu
13320 6e 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  nction is alread
13330 79 20 72 75 6e 6e 69 6e 67 20 69 6e 20 62 61 63  y running in bac
13340 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 0a  kground thread .
13350 20 20 20 20 2a 2a 20 70 49 6e 63 72 2d 3e 70 54      ** pIncr->pT
13360 61 73 6b 2d 3e 74 68 72 65 61 64 2e 20 0a 20 20  ask->thread. .  
13370 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
13380 68 69 73 20 69 73 20 74 68 65 20 49 4e 43 52 49  his is the INCRI
13390 4e 49 54 5f 52 4f 4f 54 20 6f 62 6a 65 63 74 2c  NIT_ROOT object,
133a0 20 74 68 65 6e 20 69 74 20 69 73 20 72 75 6e 6e   then it is runn
133b0 69 6e 67 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ing in the .    
133c0 2a 2a 20 6d 61 69 6e 20 56 44 42 45 20 74 68 72  ** main VDBE thr
133d0 65 61 64 2e 20 42 75 74 20 74 68 61 74 20 69 73  ead. But that is
133e0 20 4f 6b 2c 20 61 73 20 74 68 61 74 20 74 68 72   Ok, as that thr
133f0 65 61 64 20 63 61 6e 6e 6f 74 20 72 65 74 75 72  ead cannot retur
13400 6e 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c  n.    ** control
13410 20 74 6f 20 74 68 65 20 56 44 42 45 20 6f 72 20   to the VDBE or 
13420 70 72 6f 63 65 65 64 20 77 69 74 68 20 61 6e 79  proceed with any
13430 74 68 69 6e 67 20 75 73 65 66 75 6c 20 75 6e 74  thing useful unt
13440 69 6c 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 66  il the .    ** f
13450 69 72 73 74 20 72 65 73 75 6c 74 73 20 61 72 65  irst results are
13460 20 72 65 61 64 79 20 66 72 6f 6d 20 74 68 69 73   ready from this
13470 20 6d 65 72 67 65 72 20 6f 62 6a 65 63 74 20 61   merger object a
13480 6e 79 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  nyway..    */.  
13490 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
134a0 3d 49 4e 43 52 49 4e 49 54 5f 52 4f 4f 54 20 7c  =INCRINIT_ROOT |
134b0 7c 20 65 4d 6f 64 65 3d 3d 49 4e 43 52 49 4e 49  | eMode==INCRINI
134c0 54 5f 54 41 53 4b 20 29 3b 0a 20 20 20 20 72 63  T_TASK );.    rc
134d0 20 3d 20 76 64 62 65 49 6e 63 72 50 6f 70 75 6c   = vdbeIncrPopul
134e0 61 74 65 28 70 49 6e 63 72 29 3b 0a 20 20 7d 0a  ate(pIncr);.  }.
134f0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63  #endif..  if( rc
13500 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
13510 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
13520 52 5f 54 48 52 45 41 44 53 3d 3d 30 20 7c 7c 20  R_THREADS==0 || 
13530 65 4d 6f 64 65 21 3d 49 4e 43 52 49 4e 49 54 5f  eMode!=INCRINIT_
13540 54 41 53 4b 29 20 29 7b 0a 20 20 20 20 72 63 20  TASK) ){.    rc 
13550 3d 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 4e  = vdbePmaReaderN
13560 65 78 74 28 70 52 65 61 64 72 29 3b 0a 20 20 7d  ext(pReadr);.  }
13570 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
13580 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
13590 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e  _WORKER_THREADS>
135a0 30 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  0./*.** The main
135b0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 76 64 62   routine for vdb
135c0 65 50 6d 61 52 65 61 64 65 72 49 6e 63 72 4d 65  ePmaReaderIncrMe
135d0 72 67 65 49 6e 69 74 28 29 20 6f 70 65 72 61 74  rgeInit() operat
135e0 69 6f 6e 73 20 72 75 6e 20 69 6e 20 0a 2a 2a 20  ions run in .** 
135f0 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61  background threa
13600 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
13610 69 64 20 2a 76 64 62 65 50 6d 61 52 65 61 64 65  id *vdbePmaReade
13620 72 42 67 49 6e 63 72 49 6e 69 74 28 76 6f 69 64  rBgIncrInit(void
13630 20 2a 70 43 74 78 29 7b 0a 20 20 50 6d 61 52 65   *pCtx){.  PmaRe
13640 61 64 65 72 20 2a 70 52 65 61 64 65 72 20 3d 20  ader *pReader = 
13650 28 50 6d 61 52 65 61 64 65 72 2a 29 70 43 74 78  (PmaReader*)pCtx
13660 3b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 20 3d  ;.  void *pRet =
13670 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
13680 54 52 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  TR(.            
13690 20 20 20 20 20 20 76 64 62 65 50 6d 61 52 65 61        vdbePmaRea
136a0 64 65 72 49 6e 63 72 4d 65 72 67 65 49 6e 69 74  derIncrMergeInit
136b0 28 70 52 65 61 64 65 72 2c 49 4e 43 52 49 4e 49  (pReader,INCRINI
136c0 54 5f 54 41 53 4b 29 0a 20 20 20 20 20 20 20 20  T_TASK).        
136d0 20 20 20 20 20 20 20 29 3b 0a 20 20 70 52 65 61         );.  pRea
136e0 64 65 72 2d 3e 70 49 6e 63 72 2d 3e 70 54 61 73  der->pIncr->pTas
136f0 6b 2d 3e 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  k->bDone = 1;.  
13700 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
13710 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
13720 74 68 65 20 50 6d 61 52 65 61 64 65 72 20 70 61  the PmaReader pa
13730 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
13740 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  t argument is no
13750 74 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  t an incremental
13760 2d 72 65 61 64 65 72 0a 2a 2a 20 28 69 66 20 70  -reader.** (if p
13770 52 65 61 64 72 2d 3e 70 49 6e 63 72 3d 3d 30 29  Readr->pIncr==0)
13780 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
13790 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
137a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69   Otherwise, it i
137b0 6e 76 6f 6b 65 73 0a 2a 2a 20 74 68 65 20 76 64  nvokes.** the vd
137c0 62 65 50 6d 61 52 65 61 64 65 72 49 6e 63 72 4d  bePmaReaderIncrM
137d0 65 72 67 65 49 6e 69 74 28 29 20 66 75 6e 63 74  ergeInit() funct
137e0 69 6f 6e 20 77 69 74 68 20 74 68 65 20 70 61 72  ion with the par
137f0 61 6d 65 74 65 72 73 20 70 61 73 73 65 64 20 74  ameters passed t
13800 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  o.** this routin
13810 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
13820 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
13830 6d 65 72 67 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  merge..** .** If
13840 20 74 68 65 20 49 6e 63 72 4d 65 72 67 65 72 20   the IncrMerger 
13850 6f 62 6a 65 63 74 20 69 73 20 6d 75 6c 74 69 2d  object is multi-
13860 74 68 72 65 61 64 65 64 20 28 49 6e 63 72 4d 65  threaded (IncrMe
13870 72 67 65 72 2e 62 55 73 65 54 68 72 65 61 64 3d  rger.bUseThread=
13880 3d 31 29 2c 20 0a 2a 2a 20 74 68 65 6e 20 61 20  =1), .** then a 
13890 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61  background threa
138a0 64 20 69 73 20 6c 61 75 6e 63 68 65 64 20 74 6f  d is launched to
138b0 20 63 61 6c 6c 20 76 64 62 65 50 6d 61 52 65 61   call vdbePmaRea
138c0 64 65 72 49 6e 63 72 4d 65 72 67 65 49 6e 69 74  derIncrMergeInit
138d0 28 29 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  ()..** Or, if th
138e0 65 20 49 6e 63 72 4d 65 72 67 65 72 20 69 73 20  e IncrMerger is 
138f0 73 69 6e 67 6c 65 20 74 68 72 65 61 64 65 64 2c  single threaded,
13900 20 74 68 65 20 73 61 6d 65 20 66 75 6e 63 74 69   the same functi
13910 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  on is called.** 
13920 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  using the curren
13930 74 20 74 68 72 65 61 64 2e 0a 2a 2f 0a 73 74 61  t thread..*/.sta
13940 74 69 63 20 69 6e 74 20 76 64 62 65 50 6d 61 52  tic int vdbePmaR
13950 65 61 64 65 72 49 6e 63 72 49 6e 69 74 28 50 6d  eaderIncrInit(Pm
13960 61 52 65 61 64 65 72 20 2a 70 52 65 61 64 72 2c  aReader *pReadr,
13970 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 49   int eMode){.  I
13980 6e 63 72 4d 65 72 67 65 72 20 2a 70 49 6e 63 72  ncrMerger *pIncr
13990 20 3d 20 70 52 65 61 64 72 2d 3e 70 49 6e 63 72   = pReadr->pIncr
139a0 3b 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ;   /* Increment
139b0 61 6c 20 6d 65 72 67 65 72 20 2a 2f 0a 20 20 69  al merger */.  i
139c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
139d0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
139e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
139f0 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 49 6e 63  de */.  if( pInc
13a00 72 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  r ){.#if SQLITE_
13a10 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
13a20 44 53 3e 30 0a 20 20 20 20 61 73 73 65 72 74 28  DS>0.    assert(
13a30 20 70 49 6e 63 72 2d 3e 62 55 73 65 54 68 72 65   pIncr->bUseThre
13a40 61 64 3d 3d 30 20 7c 7c 20 65 4d 6f 64 65 3d 3d  ad==0 || eMode==
13a50 49 4e 43 52 49 4e 49 54 5f 54 41 53 4b 20 29 3b  INCRINIT_TASK );
13a60 0a 20 20 20 20 69 66 28 20 70 49 6e 63 72 2d 3e  .    if( pIncr->
13a70 62 55 73 65 54 68 72 65 61 64 20 29 7b 0a 20 20  bUseThread ){.  
13a80 20 20 20 20 76 6f 69 64 20 2a 70 43 74 78 20 3d      void *pCtx =
13a90 20 28 76 6f 69 64 2a 29 70 52 65 61 64 72 3b 0a   (void*)pReadr;.
13aa0 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 53        rc = vdbeS
13ab0 6f 72 74 65 72 43 72 65 61 74 65 54 68 72 65 61  orterCreateThrea
13ac0 64 28 70 49 6e 63 72 2d 3e 70 54 61 73 6b 2c 20  d(pIncr->pTask, 
13ad0 76 64 62 65 50 6d 61 52 65 61 64 65 72 42 67 49  vdbePmaReaderBgI
13ae0 6e 63 72 49 6e 69 74 2c 20 70 43 74 78 29 3b 0a  ncrInit, pCtx);.
13af0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
13b00 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20  .    {.      rc 
13b10 3d 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 49  = vdbePmaReaderI
13b20 6e 63 72 4d 65 72 67 65 49 6e 69 74 28 70 52 65  ncrMergeInit(pRe
13b30 61 64 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  adr, eMode);.   
13b40 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
13b50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
13b60 6f 63 61 74 65 20 61 20 6e 65 77 20 4d 65 72 67  ocate a new Merg
13b70 65 45 6e 67 69 6e 65 20 6f 62 6a 65 63 74 20 74  eEngine object t
13b80 6f 20 6d 65 72 67 65 20 74 68 65 20 63 6f 6e 74  o merge the cont
13b90 65 6e 74 73 20 6f 66 20 6e 50 4d 41 20 6c 65 76  ents of nPMA lev
13ba0 65 6c 2d 30 0a 2a 2a 20 50 4d 41 73 20 66 72 6f  el-0.** PMAs fro
13bb0 6d 20 70 54 61 73 6b 2d 3e 66 69 6c 65 2e 20 49  m pTask->file. I
13bc0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
13bd0 73 2c 20 73 65 74 20 2a 70 70 4f 75 74 20 74 6f  s, set *ppOut to
13be0 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65   point to.** the
13bf0 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 20   new object and 
13c00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13c10 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
13c20 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 73 65  r does occur, se
13c30 74 20 2a 70 70 4f 75 74 0a 2a 2a 20 74 6f 20 4e  t *ppOut.** to N
13c40 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ULL and return a
13c50 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
13c60 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ode..**.** When 
13c70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
13c80 20 63 61 6c 6c 65 64 2c 20 2a 70 69 4f 66 66 73   called, *piOffs
13c90 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
13ca0 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 0a 2a   offset of the.*
13cb0 2a 20 66 69 72 73 74 20 50 4d 41 20 74 6f 20 72  * first PMA to r
13cc0 65 61 64 20 66 72 6f 6d 20 70 54 61 73 6b 2d 3e  ead from pTask->
13cd0 66 69 6c 65 2e 20 41 73 73 75 6d 69 6e 67 20 6e  file. Assuming n
13ce0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
13cf0 69 74 20 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f  it is .** set to
13d00 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
13d10 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
13d20 67 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  g the last byte 
13d30 6f 66 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 50  of the last.** P
13d40 4d 41 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  MA before return
13d50 69 6e 67 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ing. If an error
13d60 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 74 68 65   does occur, the
13d70 6e 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75  n the final valu
13d80 65 20 6f 66 0a 2a 2a 20 2a 70 69 4f 66 66 73 65  e of.** *piOffse
13d90 74 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  t is undefined..
13da0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
13db0 62 65 4d 65 72 67 65 45 6e 67 69 6e 65 4c 65 76  beMergeEngineLev
13dc0 65 6c 30 28 0a 20 20 53 6f 72 74 53 75 62 74 61  el0(.  SortSubta
13dd0 73 6b 20 2a 70 54 61 73 6b 2c 20 20 20 20 20 20  sk *pTask,      
13de0 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72         /* Sorter
13df0 20 74 61 73 6b 20 74 6f 20 72 65 61 64 20 66 72   task to read fr
13e00 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 4d 41  om */.  int nPMA
13e10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13e20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13e30 72 20 6f 66 20 50 4d 41 73 20 74 6f 20 72 65 61  r of PMAs to rea
13e40 64 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4f 66  d */.  i64 *piOf
13e50 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  fset,           
13e60 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
13e70 3a 20 52 65 61 64 72 20 6f 66 66 73 65 74 20 69  : Readr offset i
13e80 6e 20 70 54 61 73 6b 2d 3e 66 69 6c 65 20 2a 2f  n pTask->file */
13e90 0a 20 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 2a  .  MergeEngine *
13ea0 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20  *ppOut          
13eb0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 6d     /* OUT: New m
13ec0 65 72 67 65 2d 65 6e 67 69 6e 65 20 2a 2f 0a 29  erge-engine */.)
13ed0 7b 0a 20 20 4d 65 72 67 65 45 6e 67 69 6e 65 20  {.  MergeEngine 
13ee0 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
13ef0 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 65 6e 67      /* Merge eng
13f00 69 6e 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ine to return */
13f10 0a 20 20 69 36 34 20 69 4f 66 66 20 3d 20 2a 70  .  i64 iOff = *p
13f20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 69  iOffset;.  int i
13f30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13f40 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2a 70 70 4f 75  ITE_OK;..  *ppOu
13f50 74 20 3d 20 70 4e 65 77 20 3d 20 76 64 62 65 4d  t = pNew = vdbeM
13f60 65 72 67 65 45 6e 67 69 6e 65 4e 65 77 28 6e 50  ergeEngineNew(nP
13f70 4d 41 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  MA);.  if( pNew=
13f80 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  =0 ) rc = SQLITE
13f90 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20  _NOMEM_BKPT;..  
13fa0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 4d 41 20  for(i=0; i<nPMA 
13fb0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
13fc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20  ; i++){.    i64 
13fd0 6e 44 75 6d 6d 79 20 3d 20 30 3b 0a 20 20 20 20  nDummy = 0;.    
13fe0 50 6d 61 52 65 61 64 65 72 20 2a 70 52 65 61 64  PmaReader *pRead
13ff0 72 20 3d 20 26 70 4e 65 77 2d 3e 61 52 65 61 64  r = &pNew->aRead
14000 72 5b 69 5d 3b 0a 20 20 20 20 72 63 20 3d 20 76  r[i];.    rc = v
14010 64 62 65 50 6d 61 52 65 61 64 65 72 49 6e 69 74  dbePmaReaderInit
14020 28 70 54 61 73 6b 2c 20 26 70 54 61 73 6b 2d 3e  (pTask, &pTask->
14030 66 69 6c 65 2c 20 69 4f 66 66 2c 20 70 52 65 61  file, iOff, pRea
14040 64 72 2c 20 26 6e 44 75 6d 6d 79 29 3b 0a 20 20  dr, &nDummy);.  
14050 20 20 69 4f 66 66 20 3d 20 70 52 65 61 64 72 2d    iOff = pReadr-
14060 3e 69 45 6f 66 3b 0a 20 20 7d 0a 0a 20 20 69 66  >iEof;.  }..  if
14070 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14080 29 7b 0a 20 20 20 20 76 64 62 65 4d 65 72 67 65  ){.    vdbeMerge
14090 45 6e 67 69 6e 65 46 72 65 65 28 70 4e 65 77 29  EngineFree(pNew)
140a0 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30  ;.    *ppOut = 0
140b0 3b 0a 20 20 7d 0a 20 20 2a 70 69 4f 66 66 73 65  ;.  }.  *piOffse
140c0 74 20 3d 20 69 4f 66 66 3b 0a 20 20 72 65 74 75  t = iOff;.  retu
140d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
140e0 52 65 74 75 72 6e 20 74 68 65 20 64 65 70 74 68  Return the depth
140f0 20 6f 66 20 61 20 74 72 65 65 20 63 6f 6d 70 72   of a tree compr
14100 69 73 69 6e 67 20 6e 50 4d 41 20 50 4d 41 73 2c  ising nPMA PMAs,
14110 20 61 73 73 75 6d 69 6e 67 20 61 20 66 61 6e 6f   assuming a fano
14120 75 74 20 6f 66 0a 2a 2a 20 53 4f 52 54 45 52 5f  ut of.** SORTER_
14130 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 2e  MAX_MERGE_COUNT.
14140 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
14150 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  lue does not inc
14160 6c 75 64 65 20 6c 65 61 66 20 6e 6f 64 65 73 2e  lude leaf nodes.
14170 0a 2a 2a 0a 2a 2a 20 69 2e 65 2e 0a 2a 2a 0a 2a  .**.** i.e..**.*
14180 2a 20 20 20 6e 50 4d 41 3c 3d 31 36 20 20 20 20  *   nPMA<=16    
14190 2d 3e 20 54 72 65 65 44 65 70 74 68 28 29 20 3d  -> TreeDepth() =
141a0 3d 20 30 0a 2a 2a 20 20 20 6e 50 4d 41 3c 3d 32  = 0.**   nPMA<=2
141b0 35 36 20 20 20 2d 3e 20 54 72 65 65 44 65 70 74  56   -> TreeDept
141c0 68 28 29 20 3d 3d 20 31 0a 2a 2a 20 20 20 6e 50  h() == 1.**   nP
141d0 4d 41 3c 3d 36 35 35 33 36 20 2d 3e 20 54 72 65  MA<=65536 -> Tre
141e0 65 44 65 70 74 68 28 29 20 3d 3d 20 32 0a 2a 2f  eDepth() == 2.*/
141f0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
14200 53 6f 72 74 65 72 54 72 65 65 44 65 70 74 68 28  SorterTreeDepth(
14210 69 6e 74 20 6e 50 4d 41 29 7b 0a 20 20 69 6e 74  int nPMA){.  int
14220 20 6e 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 69   nDepth = 0;.  i
14230 36 34 20 6e 44 69 76 20 3d 20 53 4f 52 54 45 52  64 nDiv = SORTER
14240 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55 4e 54  _MAX_MERGE_COUNT
14250 3b 0a 20 20 77 68 69 6c 65 28 20 6e 44 69 76 20  ;.  while( nDiv 
14260 3c 20 28 69 36 34 29 6e 50 4d 41 20 29 7b 0a 20  < (i64)nPMA ){. 
14270 20 20 20 6e 44 69 76 20 3d 20 6e 44 69 76 20 2a     nDiv = nDiv *
14280 20 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47   SORTER_MAX_MERG
14290 45 5f 43 4f 55 4e 54 3b 0a 20 20 20 20 6e 44 65  E_COUNT;.    nDe
142a0 70 74 68 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  pth++;.  }.  ret
142b0 75 72 6e 20 6e 44 65 70 74 68 3b 0a 7d 0a 0a 2f  urn nDepth;.}../
142c0 2a 0a 2a 2a 20 70 52 6f 6f 74 20 69 73 20 74 68  *.** pRoot is th
142d0 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 63  e root of an inc
142e0 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 2d 74  remental merge-t
142f0 72 65 65 20 77 69 74 68 20 64 65 70 74 68 20 6e  ree with depth n
14300 44 65 70 74 68 20 28 61 63 63 6f 72 64 69 6e 67  Depth (according
14310 0a 2a 2a 20 74 6f 20 76 64 62 65 53 6f 72 74 65  .** to vdbeSorte
14320 72 54 72 65 65 44 65 70 74 68 28 29 29 2e 20 70  rTreeDepth()). p
14330 4c 65 61 66 20 69 73 20 74 68 65 20 69 53 65 71  Leaf is the iSeq
14340 27 74 68 20 6c 65 61 66 20 74 6f 20 62 65 20 61  'th leaf to be a
14350 64 64 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 74  dded to the.** t
14360 72 65 65 2c 20 63 6f 75 6e 74 69 6e 67 20 66 72  ree, counting fr
14370 6f 6d 20 7a 65 72 6f 2e 20 54 68 69 73 20 66 75  om zero. This fu
14380 6e 63 74 69 6f 6e 20 61 64 64 73 20 70 4c 65 61  nction adds pLea
14390 66 20 74 6f 20 74 68 65 20 74 72 65 65 2e 0a 2a  f to the tree..*
143a0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
143b0 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
143c0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
143d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
143e0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a  n SQLite error.*
143f0 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  * code is return
14400 65 64 20 61 6e 64 20 70 4c 65 61 66 20 69 73 20  ed and pLeaf is 
14410 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
14420 20 69 6e 74 20 76 64 62 65 53 6f 72 74 65 72 41   int vdbeSorterA
14430 64 64 54 6f 54 72 65 65 28 0a 20 20 53 6f 72 74  ddToTree(.  Sort
14440 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c 20  Subtask *pTask, 
14450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14460 61 73 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ask context */. 
14470 20 69 6e 74 20 6e 44 65 70 74 68 2c 20 20 20 20   int nDepth,    
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14490 20 2f 2a 20 44 65 70 74 68 20 6f 66 20 74 72 65   /* Depth of tre
144a0 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 54  e according to T
144b0 72 65 65 44 65 70 74 68 28 29 20 2a 2f 0a 20 20  reeDepth() */.  
144c0 69 6e 74 20 69 53 65 71 2c 20 20 20 20 20 20 20  int iSeq,       
144d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144e0 2f 2a 20 53 65 71 75 65 6e 63 65 20 6e 75 6d 62  /* Sequence numb
144f0 65 72 20 6f 66 20 6c 65 61 66 20 77 69 74 68 69  er of leaf withi
14500 6e 20 74 72 65 65 20 2a 2f 0a 20 20 4d 65 72 67  n tree */.  Merg
14510 65 45 6e 67 69 6e 65 20 2a 70 52 6f 6f 74 2c 20  eEngine *pRoot, 
14520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14530 6f 6f 74 20 6f 66 20 74 72 65 65 20 2a 2f 0a 20  oot of tree */. 
14540 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 2a 70 4c   MergeEngine *pL
14550 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20  eaf             
14560 20 2f 2a 20 4c 65 61 66 20 74 6f 20 61 64 64 20   /* Leaf to add 
14570 74 6f 20 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20  to tree */.){.  
14580 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14590 4f 4b 3b 0a 20 20 69 6e 74 20 6e 44 69 76 20 3d  OK;.  int nDiv =
145a0 20 31 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d   1;.  int i;.  M
145b0 65 72 67 65 45 6e 67 69 6e 65 20 2a 70 20 3d 20  ergeEngine *p = 
145c0 70 52 6f 6f 74 3b 0a 20 20 49 6e 63 72 4d 65 72  pRoot;.  IncrMer
145d0 67 65 72 20 2a 70 49 6e 63 72 3b 0a 0a 20 20 72  ger *pIncr;..  r
145e0 63 20 3d 20 76 64 62 65 49 6e 63 72 4d 65 72 67  c = vdbeIncrMerg
145f0 65 72 4e 65 77 28 70 54 61 73 6b 2c 20 70 4c 65  erNew(pTask, pLe
14600 61 66 2c 20 26 70 49 6e 63 72 29 3b 0a 0a 20 20  af, &pIncr);..  
14610 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 44 65 70 74  for(i=1; i<nDept
14620 68 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 44 69  h; i++){.    nDi
14630 76 20 3d 20 6e 44 69 76 20 2a 20 53 4f 52 54 45  v = nDiv * SORTE
14640 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55 4e  R_MAX_MERGE_COUN
14650 54 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  T;.  }..  for(i=
14660 31 3b 20 69 3c 6e 44 65 70 74 68 20 26 26 20 72  1; i<nDepth && r
14670 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
14680 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 74 65  +){.    int iIte
14690 72 20 3d 20 28 69 53 65 71 20 2f 20 6e 44 69 76  r = (iSeq / nDiv
146a0 29 20 25 20 53 4f 52 54 45 52 5f 4d 41 58 5f 4d  ) % SORTER_MAX_M
146b0 45 52 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 20 20  ERGE_COUNT;.    
146c0 50 6d 61 52 65 61 64 65 72 20 2a 70 52 65 61 64  PmaReader *pRead
146d0 72 20 3d 20 26 70 2d 3e 61 52 65 61 64 72 5b 69  r = &p->aReadr[i
146e0 49 74 65 72 5d 3b 0a 0a 20 20 20 20 69 66 28 20  Iter];..    if( 
146f0 70 52 65 61 64 72 2d 3e 70 49 6e 63 72 3d 3d 30  pReadr->pIncr==0
14700 20 29 7b 0a 20 20 20 20 20 20 4d 65 72 67 65 45   ){.      MergeE
14710 6e 67 69 6e 65 20 2a 70 4e 65 77 20 3d 20 76 64  ngine *pNew = vd
14720 62 65 4d 65 72 67 65 45 6e 67 69 6e 65 4e 65 77  beMergeEngineNew
14730 28 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47  (SORTER_MAX_MERG
14740 45 5f 43 4f 55 4e 54 29 3b 0a 20 20 20 20 20 20  E_COUNT);.      
14750 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
14760 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
14770 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
14780 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14790 20 20 20 20 72 63 20 3d 20 76 64 62 65 49 6e 63      rc = vdbeInc
147a0 72 4d 65 72 67 65 72 4e 65 77 28 70 54 61 73 6b  rMergerNew(pTask
147b0 2c 20 70 4e 65 77 2c 20 26 70 52 65 61 64 72 2d  , pNew, &pReadr-
147c0 3e 70 49 6e 63 72 29 3b 0a 20 20 20 20 20 20 7d  >pIncr);.      }
147d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
147e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
147f0 20 20 20 20 20 20 70 20 3d 20 70 52 65 61 64 72        p = pReadr
14800 2d 3e 70 49 6e 63 72 2d 3e 70 4d 65 72 67 65 72  ->pIncr->pMerger
14810 3b 0a 20 20 20 20 20 20 6e 44 69 76 20 3d 20 6e  ;.      nDiv = n
14820 44 69 76 20 2f 20 53 4f 52 54 45 52 5f 4d 41 58  Div / SORTER_MAX
14830 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  _MERGE_COUNT;.  
14840 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
14850 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14860 20 20 20 20 70 2d 3e 61 52 65 61 64 72 5b 69 53      p->aReadr[iS
14870 65 71 20 25 20 53 4f 52 54 45 52 5f 4d 41 58 5f  eq % SORTER_MAX_
14880 4d 45 52 47 45 5f 43 4f 55 4e 54 5d 2e 70 49 6e  MERGE_COUNT].pIn
14890 63 72 20 3d 20 70 49 6e 63 72 3b 0a 20 20 7d 65  cr = pIncr;.  }e
148a0 6c 73 65 7b 0a 20 20 20 20 76 64 62 65 49 6e 63  lse{.    vdbeInc
148b0 72 46 72 65 65 28 70 49 6e 63 72 29 3b 0a 20 20  rFree(pIncr);.  
148c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
148d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
148e0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
148f0 61 73 20 70 61 72 74 20 6f 66 20 61 20 53 6f 72  as part of a Sor
14900 74 65 72 52 65 77 69 6e 64 28 29 20 6f 70 65 72  terRewind() oper
14910 61 74 69 6f 6e 20 6f 6e 20 61 20 73 6f 72 74 65  ation on a sorte
14920 72 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 61 6c  r.** that has al
14930 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 77  ready written tw
14940 6f 20 6f 72 20 6d 6f 72 65 20 6c 65 76 65 6c 2d  o or more level-
14950 30 20 50 4d 41 73 20 74 6f 20 6f 6e 65 20 6f 72  0 PMAs to one or
14960 20 6d 6f 72 65 20 74 65 6d 70 0a 2a 2a 20 66 69   more temp.** fi
14970 6c 65 73 2e 20 49 74 20 62 75 69 6c 64 73 20 61  les. It builds a
14980 20 74 72 65 65 20 6f 66 20 4d 65 72 67 65 45 6e   tree of MergeEn
14990 67 69 6e 65 2f 49 6e 63 72 4d 65 72 67 65 72 2f  gine/IncrMerger/
149a0 50 6d 61 52 65 61 64 65 72 20 6f 62 6a 65 63 74  PmaReader object
149b0 73 20 74 68 61 74 20 0a 2a 2a 20 63 61 6e 20 62  s that .** can b
149c0 65 20 75 73 65 64 20 74 6f 20 69 6e 63 72 65 6d  e used to increm
149d0 65 6e 74 61 6c 6c 79 20 6d 65 72 67 65 20 61 6c  entally merge al
149e0 6c 20 50 4d 41 73 20 6f 6e 20 64 69 73 6b 2e 0a  l PMAs on disk..
149f0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
14a00 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
14a10 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
14a20 70 70 4f 75 74 20 73 65 74 20 74 6f 20 70 6f 69  ppOut set to poi
14a30 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 4d 65 72  nt to the.** Mer
14a40 67 65 45 6e 67 69 6e 65 20 6f 62 6a 65 63 74 20  geEngine object 
14a50 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  at the root of t
14a60 68 65 20 74 72 65 65 20 62 65 66 6f 72 65 20 72  he tree before r
14a70 65 74 75 72 6e 69 6e 67 2e 20 4f 72 2c 20 69 66  eturning. Or, if
14a80 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63   an.** error occ
14a90 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
14aa0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
14ab0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 66 69  urned and the fi
14ac0 6e 61 6c 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  nal value .** of
14ad0 20 2a 70 70 4f 75 74 20 69 73 20 75 6e 64 65 66   *ppOut is undef
14ae0 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
14af0 69 6e 74 20 76 64 62 65 53 6f 72 74 65 72 4d 65  int vdbeSorterMe
14b00 72 67 65 54 72 65 65 42 75 69 6c 64 28 0a 20 20  rgeTreeBuild(.  
14b10 56 64 62 65 53 6f 72 74 65 72 20 2a 70 53 6f 72  VdbeSorter *pSor
14b20 74 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ter,       /* Th
14b30 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 74 68  e VDBE cursor th
14b40 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
14b50 65 20 73 6f 72 74 20 2a 2f 0a 20 20 4d 65 72 67  e sort */.  Merg
14b60 65 45 6e 67 69 6e 65 20 2a 2a 70 70 4f 75 74 20  eEngine **ppOut 
14b70 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
14b80 74 68 65 20 4d 65 72 67 65 45 6e 67 69 6e 65 20  the MergeEngine 
14b90 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 72  here */.){.  Mer
14ba0 67 65 45 6e 67 69 6e 65 20 2a 70 4d 61 69 6e 20  geEngine *pMain 
14bb0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
14bc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
14bd0 20 69 54 61 73 6b 3b 0a 0a 23 69 66 20 53 51 4c   iTask;..#if SQL
14be0 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
14bf0 48 52 45 41 44 53 3e 30 0a 20 20 2f 2a 20 49 66  HREADS>0.  /* If
14c00 20 74 68 65 20 73 6f 72 74 65 72 20 75 73 65 73   the sorter uses
14c10 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74   more than one t
14c20 61 73 6b 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ask, then create
14c30 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 0a   the top-level .
14c40 20 20 2a 2a 20 4d 65 72 67 65 45 6e 67 69 6e 65    ** MergeEngine
14c50 20 68 65 72 65 2e 20 54 68 69 73 20 4d 65 72 67   here. This Merg
14c60 65 45 6e 67 69 6e 65 20 77 69 6c 6c 20 72 65 61  eEngine will rea
14c70 64 20 64 61 74 61 20 66 72 6f 6d 20 65 78 61 63  d data from exac
14c80 74 6c 79 20 0a 20 20 2a 2a 20 6f 6e 65 20 50 6d  tly .  ** one Pm
14c90 61 52 65 61 64 65 72 20 70 65 72 20 73 75 62 2d  aReader per sub-
14ca0 74 61 73 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  task.  */.  asse
14cb0 72 74 28 20 70 53 6f 72 74 65 72 2d 3e 62 55 73  rt( pSorter->bUs
14cc0 65 54 68 72 65 61 64 73 20 7c 7c 20 70 53 6f 72  eThreads || pSor
14cd0 74 65 72 2d 3e 6e 54 61 73 6b 3d 3d 31 20 29 3b  ter->nTask==1 );
14ce0 0a 20 20 69 66 28 20 70 53 6f 72 74 65 72 2d 3e  .  if( pSorter->
14cf0 6e 54 61 73 6b 3e 31 20 29 7b 0a 20 20 20 20 70  nTask>1 ){.    p
14d00 4d 61 69 6e 20 3d 20 76 64 62 65 4d 65 72 67 65  Main = vdbeMerge
14d10 45 6e 67 69 6e 65 4e 65 77 28 70 53 6f 72 74 65  EngineNew(pSorte
14d20 72 2d 3e 6e 54 61 73 6b 29 3b 0a 20 20 20 20 69  r->nTask);.    i
14d30 66 28 20 70 4d 61 69 6e 3d 3d 30 20 29 20 72 63  f( pMain==0 ) rc
14d40 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
14d50 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
14d60 0a 0a 20 20 66 6f 72 28 69 54 61 73 6b 3d 30 3b  ..  for(iTask=0;
14d70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14d80 26 20 69 54 61 73 6b 3c 70 53 6f 72 74 65 72 2d  & iTask<pSorter-
14d90 3e 6e 54 61 73 6b 3b 20 69 54 61 73 6b 2b 2b 29  >nTask; iTask++)
14da0 7b 0a 20 20 20 20 53 6f 72 74 53 75 62 74 61 73  {.    SortSubtas
14db0 6b 20 2a 70 54 61 73 6b 20 3d 20 26 70 53 6f 72  k *pTask = &pSor
14dc0 74 65 72 2d 3e 61 54 61 73 6b 5b 69 54 61 73 6b  ter->aTask[iTask
14dd0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
14de0 54 61 73 6b 2d 3e 6e 50 4d 41 3e 30 20 7c 7c 20  Task->nPMA>0 || 
14df0 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
14e00 52 5f 54 48 52 45 41 44 53 3e 30 20 29 3b 0a 20  R_THREADS>0 );. 
14e10 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4d 41     if( SQLITE_MA
14e20 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
14e30 3d 3d 30 20 7c 7c 20 70 54 61 73 6b 2d 3e 6e 50  ==0 || pTask->nP
14e40 4d 41 20 29 7b 0a 20 20 20 20 20 20 4d 65 72 67  MA ){.      Merg
14e50 65 45 6e 67 69 6e 65 20 2a 70 52 6f 6f 74 20 3d  eEngine *pRoot =
14e60 20 30 3b 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20   0;     /* Root 
14e70 6e 6f 64 65 20 6f 66 20 74 72 65 65 20 66 6f 72  node of tree for
14e80 20 74 68 69 73 20 74 61 73 6b 20 2a 2f 0a 20 20   this task */.  
14e90 20 20 20 20 69 6e 74 20 6e 44 65 70 74 68 20 3d      int nDepth =
14ea0 20 76 64 62 65 53 6f 72 74 65 72 54 72 65 65 44   vdbeSorterTreeD
14eb0 65 70 74 68 28 70 54 61 73 6b 2d 3e 6e 50 4d 41  epth(pTask->nPMA
14ec0 29 3b 0a 20 20 20 20 20 20 69 36 34 20 69 52 65  );.      i64 iRe
14ed0 61 64 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 20 20  adOff = 0;..    
14ee0 20 20 69 66 28 20 70 54 61 73 6b 2d 3e 6e 50 4d    if( pTask->nPM
14ef0 41 3c 3d 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45  A<=SORTER_MAX_ME
14f00 52 47 45 5f 43 4f 55 4e 54 20 29 7b 0a 20 20 20  RGE_COUNT ){.   
14f10 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 4d 65       rc = vdbeMe
14f20 72 67 65 45 6e 67 69 6e 65 4c 65 76 65 6c 30 28  rgeEngineLevel0(
14f30 70 54 61 73 6b 2c 20 70 54 61 73 6b 2d 3e 6e 50  pTask, pTask->nP
14f40 4d 41 2c 20 26 69 52 65 61 64 4f 66 66 2c 20 26  MA, &iReadOff, &
14f50 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 7d 65  pRoot);.      }e
14f60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
14f70 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   i;.        int 
14f80 69 53 65 71 20 3d 20 30 3b 0a 20 20 20 20 20 20  iSeq = 0;.      
14f90 20 20 70 52 6f 6f 74 20 3d 20 76 64 62 65 4d 65    pRoot = vdbeMe
14fa0 72 67 65 45 6e 67 69 6e 65 4e 65 77 28 53 4f 52  rgeEngineNew(SOR
14fb0 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f  TER_MAX_MERGE_CO
14fc0 55 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  UNT);.        if
14fd0 28 20 70 52 6f 6f 74 3d 3d 30 20 29 20 72 63 20  ( pRoot==0 ) rc 
14fe0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
14ff0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  KPT;.        for
15000 28 69 3d 30 3b 20 69 3c 70 54 61 73 6b 2d 3e 6e  (i=0; i<pTask->n
15010 50 4d 41 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  PMA && rc==SQLIT
15020 45 5f 4f 4b 3b 20 69 20 2b 3d 20 53 4f 52 54 45  E_OK; i += SORTE
15030 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55 4e  R_MAX_MERGE_COUN
15040 54 29 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65  T){.          Me
15050 72 67 65 45 6e 67 69 6e 65 20 2a 70 4d 65 72 67  rgeEngine *pMerg
15060 65 72 20 3d 20 30 3b 20 2f 2a 20 4e 65 77 20 6c  er = 0; /* New l
15070 65 76 65 6c 2d 30 20 50 4d 41 20 6d 65 72 67 65  evel-0 PMA merge
15080 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  r */.          i
15090 6e 74 20 6e 52 65 61 64 65 72 3b 20 20 20 20 20  nt nReader;     
150a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
150b0 65 72 20 6f 66 20 6c 65 76 65 6c 2d 30 20 50 4d  er of level-0 PM
150c0 41 73 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 0a  As to merge */..
150d0 20 20 20 20 20 20 20 20 20 20 6e 52 65 61 64 65            nReade
150e0 72 20 3d 20 4d 49 4e 28 70 54 61 73 6b 2d 3e 6e  r = MIN(pTask->n
150f0 50 4d 41 20 2d 20 69 2c 20 53 4f 52 54 45 52 5f  PMA - i, SORTER_
15100 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 29  MAX_MERGE_COUNT)
15110 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
15120 20 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e 65   vdbeMergeEngine
15130 4c 65 76 65 6c 30 28 70 54 61 73 6b 2c 20 6e 52  Level0(pTask, nR
15140 65 61 64 65 72 2c 20 26 69 52 65 61 64 4f 66 66  eader, &iReadOff
15150 2c 20 26 70 4d 65 72 67 65 72 29 3b 0a 20 20 20  , &pMerger);.   
15160 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
15170 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15180 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
15190 65 53 6f 72 74 65 72 41 64 64 54 6f 54 72 65 65  eSorterAddToTree
151a0 28 70 54 61 73 6b 2c 20 6e 44 65 70 74 68 2c 20  (pTask, nDepth, 
151b0 69 53 65 71 2b 2b 2c 20 70 52 6f 6f 74 2c 20 70  iSeq++, pRoot, p
151c0 4d 65 72 67 65 72 29 3b 0a 20 20 20 20 20 20 20  Merger);.       
151d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
151e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
151f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15200 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
15210 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
15220 3e 30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  >0.        if( p
15230 4d 61 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20 20  Main!=0 ){.     
15240 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 49 6e       rc = vdbeIn
15250 63 72 4d 65 72 67 65 72 4e 65 77 28 70 54 61 73  crMergerNew(pTas
15260 6b 2c 20 70 52 6f 6f 74 2c 20 26 70 4d 61 69 6e  k, pRoot, &pMain
15270 2d 3e 61 52 65 61 64 72 5b 69 54 61 73 6b 5d 2e  ->aReadr[iTask].
15280 70 49 6e 63 72 29 3b 0a 20 20 20 20 20 20 20 20  pIncr);.        
15290 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
152a0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
152b0 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d   assert( pMain==
152c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
152d0 4d 61 69 6e 20 3d 20 70 52 6f 6f 74 3b 0a 20 20  Main = pRoot;.  
152e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
152f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 76 64 62  lse{.        vdb
15300 65 4d 65 72 67 65 45 6e 67 69 6e 65 46 72 65 65  eMergeEngineFree
15310 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 7d  (pRoot);.      }
15320 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
15330 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15340 29 7b 0a 20 20 20 20 76 64 62 65 4d 65 72 67 65  ){.    vdbeMerge
15350 45 6e 67 69 6e 65 46 72 65 65 28 70 4d 61 69 6e  EngineFree(pMain
15360 29 3b 0a 20 20 20 20 70 4d 61 69 6e 20 3d 20 30  );.    pMain = 0
15370 3b 0a 20 20 7d 0a 20 20 2a 70 70 4f 75 74 20 3d  ;.  }.  *ppOut =
15380 20 70 4d 61 69 6e 3b 0a 20 20 72 65 74 75 72 6e   pMain;.  return
15390 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
153a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
153b0 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
153c0 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 53   an sqlite3VdbeS
153d0 6f 72 74 65 72 52 65 77 69 6e 64 28 29 20 6f 70  orterRewind() op
153e0 65 72 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 61 20  eration.** on a 
153f0 73 6f 72 74 65 72 20 74 68 61 74 20 68 61 73 20  sorter that has 
15400 77 72 69 74 74 65 6e 20 74 77 6f 20 6f 72 20 6d  written two or m
15410 6f 72 65 20 50 4d 41 73 20 74 6f 20 74 65 6d 70  ore PMAs to temp
15420 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20  orary files. It 
15430 73 65 74 73 0a 2a 2a 20 75 70 20 65 69 74 68 65  sets.** up eithe
15440 72 20 56 64 62 65 53 6f 72 74 65 72 2e 70 4d 65  r VdbeSorter.pMe
15450 72 67 65 72 20 28 66 6f 72 20 73 69 6e 67 6c 65  rger (for single
15460 20 74 68 72 65 61 64 65 64 20 73 6f 72 74 65 72   threaded sorter
15470 73 29 20 6f 72 20 70 52 65 61 64 65 72 0a 2a 2a  s) or pReader.**
15480 20 28 66 6f 72 20 6d 75 6c 74 69 2d 74 68 72 65   (for multi-thre
15490 61 64 65 64 20 73 6f 72 74 65 72 73 29 20 73 6f  aded sorters) so
154a0 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
154b0 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
154c0 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 72  through.** all r
154d0 65 63 6f 72 64 73 20 73 74 6f 72 65 64 20 69 6e  ecords stored in
154e0 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2a 0a   the sorter..**.
154f0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
15500 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63  returned if succ
15510 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
15520 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
15530 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
15540 61 74 69 63 20 69 6e 74 20 76 64 62 65 53 6f 72  atic int vdbeSor
15550 74 65 72 53 65 74 75 70 4d 65 72 67 65 28 56 64  terSetupMerge(Vd
15560 62 65 53 6f 72 74 65 72 20 2a 70 53 6f 72 74 65  beSorter *pSorte
15570 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15590 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
155a0 63 6f 64 65 20 2a 2f 0a 20 20 53 6f 72 74 53 75  code */.  SortSu
155b0 62 74 61 73 6b 20 2a 70 54 61 73 6b 30 20 3d 20  btask *pTask0 = 
155c0 26 70 53 6f 72 74 65 72 2d 3e 61 54 61 73 6b 5b  &pSorter->aTask[
155d0 30 5d 3b 0a 20 20 4d 65 72 67 65 45 6e 67 69 6e  0];.  MergeEngin
155e0 65 20 2a 70 4d 61 69 6e 20 3d 20 30 3b 0a 23 69  e *pMain = 0;.#i
155f0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  f SQLITE_MAX_WOR
15600 4b 45 52 5f 54 48 52 45 41 44 53 0a 20 20 73 71  KER_THREADS.  sq
15610 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 54 61 73  lite3 *db = pTas
15620 6b 30 2d 3e 70 53 6f 72 74 65 72 2d 3e 64 62 3b  k0->pSorter->db;
15630 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 6f 72 74  .  int i;.  Sort
15640 65 72 43 6f 6d 70 61 72 65 20 78 43 6f 6d 70 61  erCompare xCompa
15650 72 65 20 3d 20 76 64 62 65 53 6f 72 74 65 72 47  re = vdbeSorterG
15660 65 74 43 6f 6d 70 61 72 65 28 70 53 6f 72 74 65  etCompare(pSorte
15670 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
15680 3c 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73 6b 3b  <pSorter->nTask;
15690 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 6f 72 74   i++){.    pSort
156a0 65 72 2d 3e 61 54 61 73 6b 5b 69 5d 2e 78 43 6f  er->aTask[i].xCo
156b0 6d 70 61 72 65 20 3d 20 78 43 6f 6d 70 61 72 65  mpare = xCompare
156c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
156d0 72 63 20 3d 20 76 64 62 65 53 6f 72 74 65 72 4d  rc = vdbeSorterM
156e0 65 72 67 65 54 72 65 65 42 75 69 6c 64 28 70 53  ergeTreeBuild(pS
156f0 6f 72 74 65 72 2c 20 26 70 4d 61 69 6e 29 3b 0a  orter, &pMain);.
15700 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15710 5f 4f 4b 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  _OK ){.#if SQLIT
15720 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
15730 45 41 44 53 0a 20 20 20 20 61 73 73 65 72 74 28  EADS.    assert(
15740 20 70 53 6f 72 74 65 72 2d 3e 62 55 73 65 54 68   pSorter->bUseTh
15750 72 65 61 64 73 3d 3d 30 20 7c 7c 20 70 53 6f 72  reads==0 || pSor
15760 74 65 72 2d 3e 6e 54 61 73 6b 3e 31 20 29 3b 0a  ter->nTask>1 );.
15770 20 20 20 20 69 66 28 20 70 53 6f 72 74 65 72 2d      if( pSorter-
15780 3e 62 55 73 65 54 68 72 65 61 64 73 20 29 7b 0a  >bUseThreads ){.
15790 20 20 20 20 20 20 69 6e 74 20 69 54 61 73 6b 3b        int iTask;
157a0 0a 20 20 20 20 20 20 50 6d 61 52 65 61 64 65 72  .      PmaReader
157b0 20 2a 70 52 65 61 64 72 20 3d 20 30 3b 0a 20 20   *pReadr = 0;.  
157c0 20 20 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20      SortSubtask 
157d0 2a 70 4c 61 73 74 20 3d 20 26 70 53 6f 72 74 65  *pLast = &pSorte
157e0 72 2d 3e 61 54 61 73 6b 5b 70 53 6f 72 74 65 72  r->aTask[pSorter
157f0 2d 3e 6e 54 61 73 6b 2d 31 5d 3b 0a 20 20 20 20  ->nTask-1];.    
15800 20 20 72 63 20 3d 20 76 64 62 65 53 6f 72 74 41    rc = vdbeSortA
15810 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 28 70 4c 61  llocUnpacked(pLa
15820 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
15830 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15840 20 20 20 20 20 20 20 20 70 52 65 61 64 72 20 3d          pReadr =
15850 20 28 50 6d 61 52 65 61 64 65 72 2a 29 73 71 6c   (PmaReader*)sql
15860 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
15870 28 64 62 2c 20 73 69 7a 65 6f 66 28 50 6d 61 52  (db, sizeof(PmaR
15880 65 61 64 65 72 29 29 3b 0a 20 20 20 20 20 20 20  eader));.       
15890 20 70 53 6f 72 74 65 72 2d 3e 70 52 65 61 64 65   pSorter->pReade
158a0 72 20 3d 20 70 52 65 61 64 72 3b 0a 20 20 20 20  r = pReadr;.    
158b0 20 20 20 20 69 66 28 20 70 52 65 61 64 72 3d 3d      if( pReadr==
158c0 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
158d0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
158e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
158f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15900 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
15910 49 6e 63 72 4d 65 72 67 65 72 4e 65 77 28 70 4c  IncrMergerNew(pL
15920 61 73 74 2c 20 70 4d 61 69 6e 2c 20 26 70 52 65  ast, pMain, &pRe
15930 61 64 72 2d 3e 70 49 6e 63 72 29 3b 0a 20 20 20  adr->pIncr);.   
15940 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
15950 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15960 20 20 20 20 76 64 62 65 49 6e 63 72 4d 65 72 67      vdbeIncrMerg
15970 65 72 53 65 74 54 68 72 65 61 64 73 28 70 52 65  erSetThreads(pRe
15980 61 64 72 2d 3e 70 49 6e 63 72 29 3b 0a 20 20 20  adr->pIncr);.   
15990 20 20 20 20 20 20 20 66 6f 72 28 69 54 61 73 6b         for(iTask
159a0 3d 30 3b 20 69 54 61 73 6b 3c 28 70 53 6f 72 74  =0; iTask<(pSort
159b0 65 72 2d 3e 6e 54 61 73 6b 2d 31 29 3b 20 69 54  er->nTask-1); iT
159c0 61 73 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ask++){.        
159d0 20 20 20 20 49 6e 63 72 4d 65 72 67 65 72 20 2a      IncrMerger *
159e0 70 49 6e 63 72 3b 0a 20 20 20 20 20 20 20 20 20  pIncr;.         
159f0 20 20 20 69 66 28 20 28 70 49 6e 63 72 20 3d 20     if( (pIncr = 
15a00 70 4d 61 69 6e 2d 3e 61 52 65 61 64 72 5b 69 54  pMain->aReadr[iT
15a10 61 73 6b 5d 2e 70 49 6e 63 72 29 20 29 7b 0a 20  ask].pIncr) ){. 
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 64 62               vdb
15a30 65 49 6e 63 72 4d 65 72 67 65 72 53 65 74 54 68  eIncrMergerSetTh
15a40 72 65 61 64 73 28 70 49 6e 63 72 29 3b 0a 20 20  reads(pIncr);.  
15a50 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
15a60 72 74 28 20 70 49 6e 63 72 2d 3e 70 54 61 73 6b  rt( pIncr->pTask
15a70 21 3d 70 4c 61 73 74 20 29 3b 0a 20 20 20 20 20  !=pLast );.     
15a80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15a90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
15aa0 6f 72 28 69 54 61 73 6b 3d 30 3b 20 72 63 3d 3d  or(iTask=0; rc==
15ab0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 54 61  SQLITE_OK && iTa
15ac0 73 6b 3c 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73  sk<pSorter->nTas
15ad0 6b 3b 20 69 54 61 73 6b 2b 2b 29 7b 0a 20 20 20  k; iTask++){.   
15ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
15af0 6b 20 74 68 61 74 3a 0a 20 20 20 20 20 20 20 20  k that:.        
15b00 20 20 20 20 2a 2a 20 20 20 0a 20 20 20 20 20 20      **   .      
15b10 20 20 20 20 20 20 2a 2a 20 20 20 61 29 20 54 68        **   a) Th
15b20 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  e incremental me
15b30 72 67 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  rge object is co
15b40 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
15b50 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
15b60 2a 2a 20 20 20 20 20 20 72 69 67 68 74 20 74 61  **      right ta
15b70 73 6b 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  sk, and.        
15b80 20 20 20 20 2a 2a 20 20 20 62 29 20 49 66 20 69      **   b) If i
15b90 74 20 69 73 20 75 73 69 6e 67 20 74 61 73 6b 20  t is using task 
15ba0 28 6e 54 61 73 6b 2d 31 29 2c 20 69 74 20 69 73  (nTask-1), it is
15bb0 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 72   configured to r
15bc0 75 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  un.            *
15bd0 2a 20 20 20 20 20 20 69 6e 20 73 69 6e 67 6c 65  *      in single
15be0 2d 74 68 72 65 61 64 65 64 20 6d 6f 64 65 2e 20  -threaded mode. 
15bf0 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
15c00 74 2c 20 61 73 20 74 68 65 0a 20 20 20 20 20 20  t, as the.      
15c10 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 72 6f        **      ro
15c20 6f 74 20 6d 65 72 67 65 20 28 49 4e 43 52 49 4e  ot merge (INCRIN
15c30 49 54 5f 52 4f 4f 54 29 20 77 69 6c 6c 20 62 65  IT_ROOT) will be
15c40 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
15c50 74 61 73 6b 0a 20 20 20 20 20 20 20 20 20 20 20  task.           
15c60 20 2a 2a 20 20 20 20 20 20 6f 62 6a 65 63 74 2e   **      object.
15c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
15c80 20 20 20 20 20 20 20 20 20 20 20 20 50 6d 61 52              PmaR
15c90 65 61 64 65 72 20 2a 70 20 3d 20 26 70 4d 61 69  eader *p = &pMai
15ca0 6e 2d 3e 61 52 65 61 64 72 5b 69 54 61 73 6b 5d  n->aReadr[iTask]
15cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
15cc0 73 65 72 74 28 20 70 2d 3e 70 49 6e 63 72 3d 3d  sert( p->pIncr==
15cd0 30 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 20  0 || (.         
15ce0 20 20 20 20 20 20 20 28 70 2d 3e 70 49 6e 63 72         (p->pIncr
15cf0 2d 3e 70 54 61 73 6b 3d 3d 26 70 53 6f 72 74 65  ->pTask==&pSorte
15d00 72 2d 3e 61 54 61 73 6b 5b 69 54 61 73 6b 5d 29  r->aTask[iTask])
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d20 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  a */.           
15d30 20 20 26 26 20 28 69 54 61 73 6b 21 3d 70 53 6f    && (iTask!=pSo
15d40 72 74 65 72 2d 3e 6e 54 61 73 6b 2d 31 20 7c 7c  rter->nTask-1 ||
15d50 20 70 2d 3e 70 49 6e 63 72 2d 3e 62 55 73 65 54   p->pIncr->bUseT
15d60 68 72 65 61 64 3d 3d 30 29 20 20 2f 2a 20 62 20  hread==0)  /* b 
15d70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  */.            )
15d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
15d90 63 20 3d 20 76 64 62 65 50 6d 61 52 65 61 64 65  c = vdbePmaReade
15da0 72 49 6e 63 72 49 6e 69 74 28 70 2c 20 49 4e 43  rIncrInit(p, INC
15db0 52 49 4e 49 54 5f 54 41 53 4b 29 3b 0a 20 20 20  RINIT_TASK);.   
15dc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15dd0 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 61 69 6e   }.        pMain
15de0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
15df0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15e00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15e10 20 72 63 20 3d 20 76 64 62 65 50 6d 61 52 65 61   rc = vdbePmaRea
15e20 64 65 72 49 6e 63 72 4d 65 72 67 65 49 6e 69 74  derIncrMergeInit
15e30 28 70 52 65 61 64 72 2c 20 49 4e 43 52 49 4e 49  (pReadr, INCRINI
15e40 54 5f 52 4f 4f 54 29 3b 0a 20 20 20 20 20 20 7d  T_ROOT);.      }
15e50 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
15e60 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63  f.    {.      rc
15e70 20 3d 20 76 64 62 65 4d 65 72 67 65 45 6e 67 69   = vdbeMergeEngi
15e80 6e 65 49 6e 69 74 28 70 54 61 73 6b 30 2c 20 70  neInit(pTask0, p
15e90 4d 61 69 6e 2c 20 49 4e 43 52 49 4e 49 54 5f 4e  Main, INCRINIT_N
15ea0 4f 52 4d 41 4c 29 3b 0a 20 20 20 20 20 20 70 53  ORMAL);.      pS
15eb0 6f 72 74 65 72 2d 3e 70 4d 65 72 67 65 72 20 3d  orter->pMerger =
15ec0 20 70 4d 61 69 6e 3b 0a 20 20 20 20 20 20 70 4d   pMain;.      pM
15ed0 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ain = 0;.    }. 
15ee0 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
15ef0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76  LITE_OK ){.    v
15f00 64 62 65 4d 65 72 67 65 45 6e 67 69 6e 65 46 72  dbeMergeEngineFr
15f10 65 65 28 70 4d 61 69 6e 29 3b 0a 20 20 7d 0a 20  ee(pMain);.  }. 
15f20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
15f30 2f 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 73  /*.** Once the s
15f40 6f 72 74 65 72 20 68 61 73 20 62 65 65 6e 20 70  orter has been p
15f50 6f 70 75 6c 61 74 65 64 20 62 79 20 63 61 6c 6c  opulated by call
15f60 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
15f70 53 6f 72 74 65 72 57 72 69 74 65 2c 0a 2a 2a 20  SorterWrite,.** 
15f80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
15f90 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 65 70 61   called to prepa
15fa0 72 65 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67  re for iterating
15fb0 20 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 63   through the rec
15fc0 6f 72 64 73 0a 2a 2a 20 69 6e 20 73 6f 72 74 65  ords.** in sorte
15fd0 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20  d order..*/.int 
15fe0 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
15ff0 72 52 65 77 69 6e 64 28 63 6f 6e 73 74 20 56 64  rRewind(const Vd
16000 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  beCursor *pCsr, 
16010 69 6e 74 20 2a 70 62 45 6f 66 29 7b 0a 20 20 56  int *pbEof){.  V
16020 64 62 65 53 6f 72 74 65 72 20 2a 70 53 6f 72 74  dbeSorter *pSort
16030 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
16040 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
16050 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
16060 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
16070 74 28 20 70 43 73 72 2d 3e 65 43 75 72 54 79 70  t( pCsr->eCurTyp
16080 65 3d 3d 43 55 52 54 59 50 45 5f 53 4f 52 54 45  e==CURTYPE_SORTE
16090 52 20 29 3b 0a 20 20 70 53 6f 72 74 65 72 20 3d  R );.  pSorter =
160a0 20 70 43 73 72 2d 3e 75 63 2e 70 53 6f 72 74 65   pCsr->uc.pSorte
160b0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 6f  r;.  assert( pSo
160c0 72 74 65 72 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  rter );..  /* If
160d0 20 6e 6f 20 64 61 74 61 20 68 61 73 20 62 65 65   no data has bee
160e0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  n written to dis
160f0 6b 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64  k, then do not d
16100 6f 20 73 6f 20 6e 6f 77 2e 20 49 6e 73 74 65 61  o so now. Instea
16110 64 2c 0a 20 20 2a 2a 20 73 6f 72 74 20 74 68 65  d,.  ** sort the
16120 20 56 64 62 65 53 6f 72 74 65 72 2e 70 52 65 63   VdbeSorter.pRec
16130 6f 72 64 20 6c 69 73 74 2e 20 54 68 65 20 76 64  ord list. The vd
16140 62 65 20 6c 61 79 65 72 20 77 69 6c 6c 20 72 65  be layer will re
16150 61 64 20 64 61 74 61 20 64 69 72 65 63 74 6c 79  ad data directly
16160 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69  .  ** from the i
16170 6e 2d 6d 65 6d 6f 72 79 20 6c 69 73 74 2e 20 20  n-memory list.  
16180 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72 74 65 72  */.  if( pSorter
16190 2d 3e 62 55 73 65 50 4d 41 3d 3d 30 20 29 7b 0a  ->bUsePMA==0 ){.
161a0 20 20 20 20 69 66 28 20 70 53 6f 72 74 65 72 2d      if( pSorter-
161b0 3e 6c 69 73 74 2e 70 4c 69 73 74 20 29 7b 0a 20  >list.pList ){. 
161c0 20 20 20 20 20 2a 70 62 45 6f 66 20 3d 20 30 3b       *pbEof = 0;
161d0 0a 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65  .      rc = vdbe
161e0 53 6f 72 74 65 72 53 6f 72 74 28 26 70 53 6f 72  SorterSort(&pSor
161f0 74 65 72 2d 3e 61 54 61 73 6b 5b 30 5d 2c 20 26  ter->aTask[0], &
16200 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 29 3b 0a  pSorter->list);.
16210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16220 20 2a 70 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20   *pbEof = 1;.   
16230 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
16240 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
16250 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e  e the current in
16260 2d 6d 65 6d 6f 72 79 20 6c 69 73 74 20 74 6f 20  -memory list to 
16270 61 20 50 4d 41 2e 20 57 68 65 6e 20 74 68 65 20  a PMA. When the 
16280 56 64 62 65 53 6f 72 74 65 72 57 72 69 74 65 28  VdbeSorterWrite(
16290 29 20 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ) .  ** function
162a0 20 66 6c 75 73 68 65 73 20 74 68 65 20 63 6f 6e   flushes the con
162b0 74 65 6e 74 73 20 6f 66 20 6d 65 6d 6f 72 79 20  tents of memory 
162c0 74 6f 20 64 69 73 6b 2c 20 69 74 20 69 6d 6d 65  to disk, it imme
162d0 64 69 61 74 65 6c 79 20 61 6c 77 61 79 73 0a 20  diately always. 
162e0 20 2a 2a 20 63 72 65 61 74 65 73 20 61 20 6e 65   ** creates a ne
162f0 77 20 6c 69 73 74 20 63 6f 6e 73 69 73 74 69 6e  w list consistin
16300 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 6b 65  g of a single ke
16310 79 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  y immediately af
16320 74 65 72 77 61 72 64 73 2e 0a 20 20 2a 2a 20 53  terwards..  ** S
16330 6f 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 65  o the list is ne
16340 76 65 72 20 65 6d 70 74 79 20 61 74 20 74 68 69  ver empty at thi
16350 73 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 61  s point.  */.  a
16360 73 73 65 72 74 28 20 70 53 6f 72 74 65 72 2d 3e  ssert( pSorter->
16370 6c 69 73 74 2e 70 4c 69 73 74 20 29 3b 0a 20 20  list.pList );.  
16380 72 63 20 3d 20 76 64 62 65 53 6f 72 74 65 72 46  rc = vdbeSorterF
16390 6c 75 73 68 50 4d 41 28 70 53 6f 72 74 65 72 29  lushPMA(pSorter)
163a0 3b 0a 0a 20 20 2f 2a 20 4a 6f 69 6e 20 61 6c 6c  ;..  /* Join all
163b0 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 72 63   threads */.  rc
163c0 20 3d 20 76 64 62 65 53 6f 72 74 65 72 4a 6f 69   = vdbeSorterJoi
163d0 6e 41 6c 6c 28 70 53 6f 72 74 65 72 2c 20 72 63  nAll(pSorter, rc
163e0 29 3b 0a 0a 20 20 76 64 62 65 53 6f 72 74 65 72  );..  vdbeSorter
163f0 52 65 77 69 6e 64 44 65 62 75 67 28 22 72 65 77  RewindDebug("rew
16400 69 6e 64 22 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  ind");..  /* Ass
16410 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
16420 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c 20 73  have occurred, s
16430 65 74 20 75 70 20 61 20 6d 65 72 67 65 72 20 73  et up a merger s
16440 74 72 75 63 74 75 72 65 20 74 6f 20 0a 20 20 2a  tructure to .  *
16450 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20  * incrementally 
16460 72 65 61 64 20 61 6e 64 20 6d 65 72 67 65 20 61  read and merge a
16470 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 50 4d 41  ll remaining PMA
16480 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
16490 20 70 53 6f 72 74 65 72 2d 3e 70 52 65 61 64 65   pSorter->pReade
164a0 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 72 63  r==0 );.  if( rc
164b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
164c0 20 20 20 72 63 20 3d 20 76 64 62 65 53 6f 72 74     rc = vdbeSort
164d0 65 72 53 65 74 75 70 4d 65 72 67 65 28 70 53 6f  erSetupMerge(pSo
164e0 72 74 65 72 29 3b 0a 20 20 20 20 2a 70 62 45 6f  rter);.    *pbEo
164f0 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 76 64  f = 0;.  }..  vd
16500 62 65 53 6f 72 74 65 72 52 65 77 69 6e 64 44 65  beSorterRewindDe
16510 62 75 67 28 22 72 65 77 69 6e 64 64 6f 6e 65 22  bug("rewinddone"
16520 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16530 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
16540 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6c 65   to the next ele
16550 6d 65 6e 74 20 69 6e 20 74 68 65 20 73 6f 72 74  ment in the sort
16560 65 72 2e 20 20 52 65 74 75 72 6e 20 76 61 6c 75  er.  Return valu
16570 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49  e:.**.**    SQLI
16580 54 45 5f 4f 4b 20 20 20 20 20 73 75 63 63 65 73  TE_OK     succes
16590 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 44  s.**    SQLITE_D
165a0 4f 4e 45 20 20 20 65 6e 64 20 6f 66 20 64 61 74  ONE   end of dat
165b0 61 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77 69 73  a.**    otherwis
165c0 65 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20  e     some kind 
165d0 6f 66 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74  of error..*/.int
165e0 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
165f0 65 72 4e 65 78 74 28 73 71 6c 69 74 65 33 20 2a  erNext(sqlite3 *
16600 64 62 2c 20 63 6f 6e 73 74 20 56 64 62 65 43 75  db, const VdbeCu
16610 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 56  rsor *pCsr){.  V
16620 64 62 65 53 6f 72 74 65 72 20 2a 70 53 6f 72 74  dbeSorter *pSort
16630 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  er;.  int rc;   
16640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16650 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
16660 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
16670 74 28 20 70 43 73 72 2d 3e 65 43 75 72 54 79 70  t( pCsr->eCurTyp
16680 65 3d 3d 43 55 52 54 59 50 45 5f 53 4f 52 54 45  e==CURTYPE_SORTE
16690 52 20 29 3b 0a 20 20 70 53 6f 72 74 65 72 20 3d  R );.  pSorter =
166a0 20 70 43 73 72 2d 3e 75 63 2e 70 53 6f 72 74 65   pCsr->uc.pSorte
166b0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 6f  r;.  assert( pSo
166c0 72 74 65 72 2d 3e 62 55 73 65 50 4d 41 20 7c 7c  rter->bUsePMA ||
166d0 20 28 70 53 6f 72 74 65 72 2d 3e 70 52 65 61 64   (pSorter->pRead
166e0 65 72 3d 3d 30 20 26 26 20 70 53 6f 72 74 65 72  er==0 && pSorter
166f0 2d 3e 70 4d 65 72 67 65 72 3d 3d 30 29 20 29 3b  ->pMerger==0) );
16700 0a 20 20 69 66 28 20 70 53 6f 72 74 65 72 2d 3e  .  if( pSorter->
16710 62 55 73 65 50 4d 41 20 29 7b 0a 20 20 20 20 61  bUsePMA ){.    a
16720 73 73 65 72 74 28 20 70 53 6f 72 74 65 72 2d 3e  ssert( pSorter->
16730 70 52 65 61 64 65 72 3d 3d 30 20 7c 7c 20 70 53  pReader==0 || pS
16740 6f 72 74 65 72 2d 3e 70 4d 65 72 67 65 72 3d 3d  orter->pMerger==
16750 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
16760 20 70 53 6f 72 74 65 72 2d 3e 62 55 73 65 54 68   pSorter->bUseTh
16770 72 65 61 64 73 3d 3d 30 20 7c 7c 20 70 53 6f 72  reads==0 || pSor
16780 74 65 72 2d 3e 70 52 65 61 64 65 72 20 29 3b 0a  ter->pReader );.
16790 20 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72      assert( pSor
167a0 74 65 72 2d 3e 62 55 73 65 54 68 72 65 61 64 73  ter->bUseThreads
167b0 3d 3d 31 20 7c 7c 20 70 53 6f 72 74 65 72 2d 3e  ==1 || pSorter->
167c0 70 4d 65 72 67 65 72 20 29 3b 0a 23 69 66 20 53  pMerger );.#if S
167d0 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
167e0 5f 54 48 52 45 41 44 53 3e 30 0a 20 20 20 20 69  _THREADS>0.    i
167f0 66 28 20 70 53 6f 72 74 65 72 2d 3e 62 55 73 65  f( pSorter->bUse
16800 54 68 72 65 61 64 73 20 29 7b 0a 20 20 20 20 20  Threads ){.     
16810 20 72 63 20 3d 20 76 64 62 65 50 6d 61 52 65 61   rc = vdbePmaRea
16820 64 65 72 4e 65 78 74 28 70 53 6f 72 74 65 72 2d  derNext(pSorter-
16830 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20  >pReader);.     
16840 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16850 4f 4b 20 26 26 20 70 53 6f 72 74 65 72 2d 3e 70  OK && pSorter->p
16860 52 65 61 64 65 72 2d 3e 70 46 64 3d 3d 30 20 29  Reader->pFd==0 )
16870 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
16880 45 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  E;.    }else.#en
16890 64 69 66 0a 20 20 20 20 2f 2a 69 66 28 20 21 70  dif.    /*if( !p
168a0 53 6f 72 74 65 72 2d 3e 62 55 73 65 54 68 72 65  Sorter->bUseThre
168b0 61 64 73 20 29 2a 2f 20 7b 0a 20 20 20 20 20 20  ads )*/ {.      
168c0 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 20  int res = 0;.   
168d0 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74     assert( pSort
168e0 65 72 2d 3e 70 4d 65 72 67 65 72 21 3d 30 20 29  er->pMerger!=0 )
168f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16900 70 53 6f 72 74 65 72 2d 3e 70 4d 65 72 67 65 72  pSorter->pMerger
16910 2d 3e 70 54 61 73 6b 3d 3d 28 26 70 53 6f 72 74  ->pTask==(&pSort
16920 65 72 2d 3e 61 54 61 73 6b 5b 30 5d 29 20 29 3b  er->aTask[0]) );
16930 0a 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65  .      rc = vdbe
16940 4d 65 72 67 65 45 6e 67 69 6e 65 53 74 65 70 28  MergeEngineStep(
16950 70 53 6f 72 74 65 72 2d 3e 70 4d 65 72 67 65 72  pSorter->pMerger
16960 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69  , &res);.      i
16970 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16980 20 26 26 20 72 65 73 20 29 20 72 63 20 3d 20 53   && res ) rc = S
16990 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
169a0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53  }.  }else{.    S
169b0 6f 72 74 65 72 52 65 63 6f 72 64 20 2a 70 46 72  orterRecord *pFr
169c0 65 65 20 3d 20 70 53 6f 72 74 65 72 2d 3e 6c 69  ee = pSorter->li
169d0 73 74 2e 70 4c 69 73 74 3b 0a 20 20 20 20 70 53  st.pList;.    pS
169e0 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69 73  orter->list.pLis
169f0 74 20 3d 20 70 46 72 65 65 2d 3e 75 2e 70 4e 65  t = pFree->u.pNe
16a00 78 74 3b 0a 20 20 20 20 70 46 72 65 65 2d 3e 75  xt;.    pFree->u
16a10 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  .pNext = 0;.    
16a20 69 66 28 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73  if( pSorter->lis
16a30 74 2e 61 4d 65 6d 6f 72 79 3d 3d 30 20 29 20 76  t.aMemory==0 ) v
16a40 64 62 65 53 6f 72 74 65 72 52 65 63 6f 72 64 46  dbeSorterRecordF
16a50 72 65 65 28 64 62 2c 20 70 46 72 65 65 29 3b 0a  ree(db, pFree);.
16a60 20 20 20 20 72 63 20 3d 20 70 53 6f 72 74 65 72      rc = pSorter
16a70 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 20 3f 20 53  ->list.pList ? S
16a80 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
16a90 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65  E_DONE;.  }.  re
16aa0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16ab0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
16ac0 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  er to a buffer o
16ad0 77 6e 65 64 20 62 79 20 74 68 65 20 73 6f 72 74  wned by the sort
16ae0 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  er that contains
16af0 20 74 68 65 20 0a 2a 2a 20 63 75 72 72 65 6e 74   the .** current
16b00 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   key..*/.static 
16b10 76 6f 69 64 20 2a 76 64 62 65 53 6f 72 74 65 72  void *vdbeSorter
16b20 52 6f 77 6b 65 79 28 0a 20 20 63 6f 6e 73 74 20  Rowkey(.  const 
16b30 56 64 62 65 53 6f 72 74 65 72 20 2a 70 53 6f 72  VdbeSorter *pSor
16b40 74 65 72 2c 20 20 20 20 20 20 2f 2a 20 53 6f 72  ter,      /* Sor
16b50 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
16b60 69 6e 74 20 2a 70 6e 4b 65 79 20 20 20 20 20 20  int *pnKey      
16b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b80 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
16b90 63 75 72 72 65 6e 74 20 6b 65 79 20 69 6e 20 62  current key in b
16ba0 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  ytes */.){.  voi
16bb0 64 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70  d *pKey;.  if( p
16bc0 53 6f 72 74 65 72 2d 3e 62 55 73 65 50 4d 41 20  Sorter->bUsePMA 
16bd0 29 7b 0a 20 20 20 20 50 6d 61 52 65 61 64 65 72  ){.    PmaReader
16be0 20 2a 70 52 65 61 64 65 72 3b 0a 23 69 66 20 53   *pReader;.#if S
16bf0 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
16c00 5f 54 48 52 45 41 44 53 3e 30 0a 20 20 20 20 69  _THREADS>0.    i
16c10 66 28 20 70 53 6f 72 74 65 72 2d 3e 62 55 73 65  f( pSorter->bUse
16c20 54 68 72 65 61 64 73 20 29 7b 0a 20 20 20 20 20  Threads ){.     
16c30 20 70 52 65 61 64 65 72 20 3d 20 70 53 6f 72 74   pReader = pSort
16c40 65 72 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20  er->pReader;.   
16c50 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
16c60 20 20 2f 2a 69 66 28 20 21 70 53 6f 72 74 65 72    /*if( !pSorter
16c70 2d 3e 62 55 73 65 54 68 72 65 61 64 73 20 29 2a  ->bUseThreads )*
16c80 2f 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72  /{.      pReader
16c90 20 3d 20 26 70 53 6f 72 74 65 72 2d 3e 70 4d 65   = &pSorter->pMe
16ca0 72 67 65 72 2d 3e 61 52 65 61 64 72 5b 70 53 6f  rger->aReadr[pSo
16cb0 72 74 65 72 2d 3e 70 4d 65 72 67 65 72 2d 3e 61  rter->pMerger->a
16cc0 54 72 65 65 5b 31 5d 5d 3b 0a 20 20 20 20 7d 0a  Tree[1]];.    }.
16cd0 20 20 20 20 2a 70 6e 4b 65 79 20 3d 20 70 52 65      *pnKey = pRe
16ce0 61 64 65 72 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20  ader->nKey;.    
16cf0 70 4b 65 79 20 3d 20 70 52 65 61 64 65 72 2d 3e  pKey = pReader->
16d00 61 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  aKey;.  }else{. 
16d10 20 20 20 2a 70 6e 4b 65 79 20 3d 20 70 53 6f 72     *pnKey = pSor
16d20 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 2d  ter->list.pList-
16d30 3e 6e 56 61 6c 3b 0a 20 20 20 20 70 4b 65 79 20  >nVal;.    pKey 
16d40 3d 20 53 52 56 41 4c 28 70 53 6f 72 74 65 72 2d  = SRVAL(pSorter-
16d50 3e 6c 69 73 74 2e 70 4c 69 73 74 29 3b 0a 20 20  >list.pList);.  
16d60 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b  }.  return pKey;
16d70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
16d80 68 65 20 63 75 72 72 65 6e 74 20 73 6f 72 74 65  he current sorte
16d90 72 20 6b 65 79 20 69 6e 74 6f 20 74 68 65 20 6d  r key into the m
16da0 65 6d 6f 72 79 20 63 65 6c 6c 20 70 4f 75 74 2e  emory cell pOut.
16db0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
16dc0 64 62 65 53 6f 72 74 65 72 52 6f 77 6b 65 79 28  dbeSorterRowkey(
16dd0 63 6f 6e 73 74 20 56 64 62 65 43 75 72 73 6f 72  const VdbeCursor
16de0 20 2a 70 43 73 72 2c 20 4d 65 6d 20 2a 70 4f 75   *pCsr, Mem *pOu
16df0 74 29 7b 0a 20 20 56 64 62 65 53 6f 72 74 65 72  t){.  VdbeSorter
16e00 20 2a 70 53 6f 72 74 65 72 3b 0a 20 20 76 6f 69   *pSorter;.  voi
16e10 64 20 2a 70 4b 65 79 3b 20 69 6e 74 20 6e 4b 65  d *pKey; int nKe
16e20 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
16e30 53 6f 72 74 65 72 20 6b 65 79 20 74 6f 20 63 6f  Sorter key to co
16e40 70 79 20 69 6e 74 6f 20 70 4f 75 74 20 2a 2f 0a  py into pOut */.
16e50 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
16e60 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
16e70 50 45 5f 53 4f 52 54 45 52 20 29 3b 0a 20 20 70  PE_SORTER );.  p
16e80 53 6f 72 74 65 72 20 3d 20 70 43 73 72 2d 3e 75  Sorter = pCsr->u
16e90 63 2e 70 53 6f 72 74 65 72 3b 0a 20 20 70 4b 65  c.pSorter;.  pKe
16ea0 79 20 3d 20 76 64 62 65 53 6f 72 74 65 72 52 6f  y = vdbeSorterRo
16eb0 77 6b 65 79 28 70 53 6f 72 74 65 72 2c 20 26 6e  wkey(pSorter, &n
16ec0 4b 65 79 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Key);.  if( sqli
16ed0 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
16ee0 6e 64 52 65 73 69 7a 65 28 70 4f 75 74 2c 20 6e  ndResize(pOut, n
16ef0 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Key) ){.    retu
16f00 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
16f10 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 4f 75 74  BKPT;.  }.  pOut
16f20 2d 3e 6e 20 3d 20 6e 4b 65 79 3b 0a 20 20 4d 65  ->n = nKey;.  Me
16f30 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
16f40 74 2c 20 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20 20  t, MEM_Blob);.  
16f50 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e 7a 2c 20  memcpy(pOut->z, 
16f60 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 0a 20 20  pKey, nKey);..  
16f70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16f80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
16f90 72 65 20 74 68 65 20 6b 65 79 20 69 6e 20 6d 65  re the key in me
16fa0 6d 6f 72 79 20 63 65 6c 6c 20 70 56 61 6c 20 77  mory cell pVal w
16fb0 69 74 68 20 74 68 65 20 6b 65 79 20 74 68 61 74  ith the key that
16fc0 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73   the sorter curs
16fd0 6f 72 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  or.** passed as 
16fe0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
16ff0 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  nt currently poi
17000 6e 74 73 20 74 6f 2e 20 46 6f 72 20 74 68 65 20  nts to. For the 
17010 70 75 72 70 6f 73 65 73 20 6f 66 0a 2a 2a 20 74  purposes of.** t
17020 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 69  he comparison, i
17030 67 6e 6f 72 65 20 74 68 65 20 72 6f 77 69 64 20  gnore the rowid 
17040 66 69 65 6c 64 20 61 74 20 74 68 65 20 65 6e 64  field at the end
17050 20 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64 2e   of each record.
17060 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f  .**.** If the so
17070 72 74 65 72 20 63 75 72 73 6f 72 20 6b 65 79 20  rter cursor key 
17080 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c  contains any NUL
17090 4c 20 76 61 6c 75 65 73 2c 20 63 6f 6e 73 69 64  L values, consid
170a0 65 72 20 69 74 20 74 6f 20 62 65 0a 2a 2a 20 6c  er it to be.** l
170b0 65 73 73 20 74 68 61 6e 20 70 56 61 6c 2e 20 45  ess than pVal. E
170c0 76 65 6e 20 69 66 20 70 56 61 6c 20 61 6c 73 6f  ven if pVal also
170d0 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76   contains NULL v
170e0 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alues..**.** If 
170f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
17100 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
17110 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
17120 65 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  e. SQLITE_NOMEM)
17130 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
17140 73 65 74 20 2a 70 52 65 73 20 74 6f 20 61 20 6e  set *pRes to a n
17150 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72  egative, zero or
17160 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
17170 69 66 20 74 68 65 0a 2a 2a 20 6b 65 79 20 69 6e  if the.** key in
17180 20 70 56 61 6c 20 69 73 20 73 6d 61 6c 6c 65 72   pVal is smaller
17190 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
171a0 6f 72 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  or larger than t
171b0 68 65 20 63 75 72 72 65 6e 74 20 73 6f 72 74 65  he current sorte
171c0 72 0a 2a 2a 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  r.** key..**.** 
171d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72  This routine for
171e0 6d 73 20 74 68 65 20 63 6f 72 65 20 6f 66 20 74  ms the core of t
171f0 68 65 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70  he OP_SorterComp
17200 61 72 65 20 6f 70 63 6f 64 65 2c 20 77 68 69 63  are opcode, whic
17210 68 20 69 6e 0a 2a 2a 20 74 75 72 6e 20 69 73 20  h in.** turn is 
17220 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 75  used to verify u
17230 6e 69 71 75 65 6e 65 73 73 20 77 68 65 6e 20 63  niqueness when c
17240 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 55 4e  onstructing a UN
17250 49 51 55 45 20 49 4e 44 45 58 2e 0a 2a 2f 0a 69  IQUE INDEX..*/.i
17260 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f  nt sqlite3VdbeSo
17270 72 74 65 72 43 6f 6d 70 61 72 65 28 0a 20 20 63  rterCompare(.  c
17280 6f 6e 73 74 20 56 64 62 65 43 75 72 73 6f 72 20  onst VdbeCursor 
17290 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 2f  *pCsr,         /
172a0 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20  * Sorter cursor 
172b0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 56 61 6c 2c 20  */.  Mem *pVal, 
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172d0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
172e0 20 63 6f 6d 70 61 72 65 20 74 6f 20 63 75 72 72   compare to curr
172f0 65 6e 74 20 73 6f 72 74 65 72 20 6b 65 79 20 2a  ent sorter key *
17300 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 2c  /.  int nKeyCol,
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 43 6f 6d 70 61 72 65 20 74      /* Compare t
17330 68 69 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  his many columns
17340 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
17350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17360 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
17370 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73  sult of comparis
17380 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 53  on */.){.  VdbeS
17390 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72 3b 0a  orter *pSorter;.
173a0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
173b0 20 2a 72 32 3b 0a 20 20 4b 65 79 49 6e 66 6f 20   *r2;.  KeyInfo 
173c0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74  *pKeyInfo;.  int
173d0 20 69 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79   i;.  void *pKey
173e0 3b 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20  ; int nKey;     
173f0 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20        /* Sorter 
17400 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 70  key to compare p
17410 56 61 6c 20 77 69 74 68 20 2a 2f 0a 0a 20 20 61  Val with */..  a
17420 73 73 65 72 74 28 20 70 43 73 72 2d 3e 65 43 75  ssert( pCsr->eCu
17430 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 53  rType==CURTYPE_S
17440 4f 52 54 45 52 20 29 3b 0a 20 20 70 53 6f 72 74  ORTER );.  pSort
17450 65 72 20 3d 20 70 43 73 72 2d 3e 75 63 2e 70 53  er = pCsr->uc.pS
17460 6f 72 74 65 72 3b 0a 20 20 72 32 20 3d 20 70 53  orter;.  r2 = pS
17470 6f 72 74 65 72 2d 3e 70 55 6e 70 61 63 6b 65 64  orter->pUnpacked
17480 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ;.  pKeyInfo = p
17490 43 73 72 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  Csr->pKeyInfo;. 
174a0 20 69 66 28 20 72 32 3d 3d 30 20 29 7b 0a 20 20   if( r2==0 ){.  
174b0 20 20 72 32 20 3d 20 70 53 6f 72 74 65 72 2d 3e    r2 = pSorter->
174c0 70 55 6e 70 61 63 6b 65 64 20 3d 20 73 71 6c 69  pUnpacked = sqli
174d0 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
174e0 63 6b 65 64 52 65 63 6f 72 64 28 70 4b 65 79 49  ckedRecord(pKeyI
174f0 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 32  nfo);.    if( r2
17500 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
17510 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
17520 20 20 20 20 72 32 2d 3e 6e 46 69 65 6c 64 20 3d      r2->nField =
17530 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 7d 0a 20 20   nKeyCol;.  }.  
17540 61 73 73 65 72 74 28 20 72 32 2d 3e 6e 46 69 65  assert( r2->nFie
17550 6c 64 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 0a  ld==nKeyCol );..
17560 20 20 70 4b 65 79 20 3d 20 76 64 62 65 53 6f 72    pKey = vdbeSor
17570 74 65 72 52 6f 77 6b 65 79 28 70 53 6f 72 74 65  terRowkey(pSorte
17580 72 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c  r, &nKey);.  sql
17590 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
175a0 70 61 63 6b 28 70 4b 65 79 49 6e 66 6f 2c 20 6e  pack(pKeyInfo, n
175b0 4b 65 79 2c 20 70 4b 65 79 2c 20 72 32 29 3b 0a  Key, pKey, r2);.
175c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65    for(i=0; i<nKe
175d0 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
175e0 69 66 28 20 72 32 2d 3e 61 4d 65 6d 5b 69 5d 2e  if( r2->aMem[i].
175f0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
17600 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
17610 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
17620 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17630 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 52 65 73    }.  }..  *pRes
17640 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
17650 63 6f 72 64 43 6f 6d 70 61 72 65 28 70 56 61 6c  cordCompare(pVal
17660 2d 3e 6e 2c 20 70 56 61 6c 2d 3e 7a 2c 20 72 32  ->n, pVal->z, r2
17670 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17680 54 45 5f 4f 4b 3b 0a 7d 0a                       TE_OK;.}.