Fixed endless loop in Z order range query code in SQLite3 backend.

This commit is contained in:
Sascha L. Teichmann 2015-07-21 12:53:55 +02:00
parent 80113b885f
commit 470b47f70a

View File

@ -327,49 +327,50 @@ func (ss *SqliteSession) interleavedSpatialQuery(first, second []byte, done chan
zmin, zmax = order(zmin, zmax) zmin, zmax = order(zmin, zmax)
cub := common.Cuboid{P1: c1, P2: c2} cub := common.Cuboid{P1: c1, P2: c2}
rangeStmt := ss.txStmt(ss.backend.rangeStmt) rangeStmt := ss.txStmt(ss.backend.rangeStmt)
OUTER: var (
for { err error
var ( rows *sql.Rows
err error )
rows *sql.Rows loop:
) // log.Printf("query %d %d\n", zmin, zmax)
if rows, err = rangeStmt.Query(zmin, zmax); err != nil { if rows, err = rangeStmt.Query(zmin, zmax); err != nil {
log.Printf("Error in range query: %s\n", err) 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 return
} }
for rows.Next() { // log.Printf("zcode: %d\n", zcode)
var zcode int64 c := common.InterleavedToCoord(zcode)
var data []byte if cub.Contains(c) {
if err = rows.Scan(&zcode, &data); err != nil { var encodedKey []byte
log.Printf("Error in scanning row: %s\n", err) if encodedKey, err = common.EncodeStringToBytes(common.CoordToPlain(c)); err != nil {
log.Printf("Key encoding failed: %s\n", err)
rows.Close() rows.Close()
return return
} }
c := common.InterleavedToCoord(zcode) select {
if cub.Contains(c) { case blocks <- Block{Key: encodedKey, Data: data}:
var encodedKey []byte case <-done:
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
rows.Close() rows.Close()
zmin = common.BigMin(zmin, zmax, zcode) return
continue OUTER
} }
} 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 return