mirror of
				https://github.com/sqlite/sqlite.git
				synced 2025-11-03 16:53:36 +03:00 
			
		
		
		
	Change the recursive common table expression algorithm to use a queue instead
of a pair of tables. Runs about 25% faster on the sudoku solver query. The OP_SwapCursors opcode is no longer required. The current implementation uses just a fifo, but the plan is to change it into a queue that will support ORDER BY and LIMIT in a recursive query. FossilOrigin-Name: b2671e1133d2f1fbd36e7cd4b86d6cc7b528aa97
This commit is contained in:
		@@ -1177,7 +1177,7 @@ static int str_in_array(const char *zStr, const char **azArray){
 | 
			
		||||
**
 | 
			
		||||
**     * For each "Goto", if the jump destination is earlier in the program
 | 
			
		||||
**       and ends on one of:
 | 
			
		||||
**          Yield  SeekGt  SeekLt  RowSetRead
 | 
			
		||||
**          Yield  SeekGt  SeekLt  RowSetRead  Rewind
 | 
			
		||||
**       then indent all opcodes between the earlier instruction
 | 
			
		||||
**       and "Goto" by 2 spaces.
 | 
			
		||||
*/
 | 
			
		||||
@@ -1189,7 +1189,7 @@ static void explain_data_prepare(struct callback_data *p, sqlite3_stmt *pSql){
 | 
			
		||||
  int iOp;                        /* Index of operation in p->aiIndent[] */
 | 
			
		||||
 | 
			
		||||
  const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
 | 
			
		||||
  const char *azYield[] = { "Yield", "SeekLt", "SeekGt", "RowSetRead", 0 };
 | 
			
		||||
  const char *azYield[] = { "Yield", "SeekLt", "SeekGt", "RowSetRead", "Rewind", 0 };
 | 
			
		||||
  const char *azGoto[] = { "Goto", 0 };
 | 
			
		||||
 | 
			
		||||
  /* Try to figure out if this is really an EXPLAIN statement. If this
 | 
			
		||||
@@ -1226,7 +1226,7 @@ static void explain_data_prepare(struct callback_data *p, sqlite3_stmt *pSql){
 | 
			
		||||
      for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
 | 
			
		||||
    }
 | 
			
		||||
    if( str_in_array(zOp, azGoto) && p2op<p->nIndent && abYield[p2op] ){
 | 
			
		||||
      for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
 | 
			
		||||
      for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user