mirror of
				https://bitbucket.org/s_l_teichmann/mtsatellite
				synced 2025-10-31 08:05:27 +01:00 
			
		
		
		
	Fixed endless loop in Z order range query code in SQLite3 backend.
This commit is contained in:
		| @@ -327,49 +327,50 @@ func (ss *SqliteSession) interleavedSpatialQuery(first, second []byte, done chan | ||||
| 		zmin, zmax = order(zmin, zmax) | ||||
| 		cub := common.Cuboid{P1: c1, P2: c2} | ||||
| 		rangeStmt := ss.txStmt(ss.backend.rangeStmt) | ||||
| 	OUTER: | ||||
| 		for { | ||||
| 			var ( | ||||
| 				err  error | ||||
| 				rows *sql.Rows | ||||
| 			) | ||||
| 			if rows, err = rangeStmt.Query(zmin, zmax); err != nil { | ||||
| 				log.Printf("Error in range query: %s\n", err) | ||||
| 		var ( | ||||
| 			err  error | ||||
| 			rows *sql.Rows | ||||
| 		) | ||||
| 	loop: | ||||
| 		// log.Printf("query %d %d\n", zmin, zmax) | ||||
| 		if rows, err = rangeStmt.Query(zmin, zmax); err != nil { | ||||
| 			log.Printf("Error in range query: %s\n", err) | ||||
| 			return | ||||
| 		} | ||||
| 		for rows.Next() { | ||||
| 			var zcode int64 | ||||
| 			var data []byte | ||||
| 			if err = rows.Scan(&zcode, &data); err != nil { | ||||
| 				log.Printf("Error in scanning row: %s\n", err) | ||||
| 				rows.Close() | ||||
| 				return | ||||
| 			} | ||||
| 			for rows.Next() { | ||||
| 				var zcode int64 | ||||
| 				var data []byte | ||||
| 				if err = rows.Scan(&zcode, &data); err != nil { | ||||
| 					log.Printf("Error in scanning row: %s\n", err) | ||||
| 			// log.Printf("zcode: %d\n", zcode) | ||||
| 			c := common.InterleavedToCoord(zcode) | ||||
| 			if cub.Contains(c) { | ||||
| 				var encodedKey []byte | ||||
| 				if encodedKey, err = common.EncodeStringToBytes(common.CoordToPlain(c)); err != nil { | ||||
| 					log.Printf("Key encoding failed: %s\n", err) | ||||
| 					rows.Close() | ||||
| 					return | ||||
| 				} | ||||
| 				c := common.InterleavedToCoord(zcode) | ||||
| 				if cub.Contains(c) { | ||||
| 					var encodedKey []byte | ||||
| 					if encodedKey, err = common.EncodeStringToBytes(common.CoordToPlain(c)); err != nil { | ||||
| 						log.Printf("Key encoding failed: %s\n", err) | ||||
| 						rows.Close() | ||||
| 						return | ||||
| 					} | ||||
| 					select { | ||||
| 					case blocks <- Block{Key: encodedKey, Data: data}: | ||||
| 					case <-done: | ||||
| 						rows.Close() | ||||
| 						return | ||||
| 					} | ||||
| 				} else { // Left the cuboid | ||||
| 				select { | ||||
| 				case blocks <- Block{Key: encodedKey, Data: data}: | ||||
| 				case <-done: | ||||
| 					rows.Close() | ||||
| 					zmin = common.BigMin(zmin, zmax, zcode) | ||||
| 					continue OUTER | ||||
| 					return | ||||
| 				} | ||||
| 			} else { // Left the cuboid | ||||
| 				// log.Printf("Left cuboid %d\n", zcode) | ||||
| 				rows.Close() | ||||
| 				zmin = common.BigMin(zmin, zmax, zcode) | ||||
| 				goto loop | ||||
| 			} | ||||
| 			if err = rows.Err(); err != nil { | ||||
| 				log.Printf("Error in range query: %s\n", err) | ||||
| 			} | ||||
| 			rows.Close() | ||||
| 		} | ||||
| 		if err = rows.Err(); err != nil { | ||||
| 			log.Printf("Error in range query: %s\n", err) | ||||
| 		} | ||||
| 		rows.Close() | ||||
| 	}() | ||||
|  | ||||
| 	return | ||||
|   | ||||
		Reference in New Issue
	
	Block a user