From 92dc5fc77a4d072d59aee2dbbf06f50d16cfc167 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Tue, 27 Nov 2018 17:12:28 +0400 Subject: [PATCH] don't return false positives when searching for a prefix of a tag value (#2919) Fixes #2908 --- CHANGELOG_PENDING.md | 1 + state/txindex/kv/kv.go | 4 ++-- state/txindex/kv/kv_test.go | 2 ++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index 1bc1910a8..d6fcc736b 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -37,6 +37,7 @@ program](https://hackerone.com/tendermint). - [blockchain] \#2731 Retry both blocks if either is bad to avoid getting stuck during fast sync (@goolAdapter) - [log] \#2868 fix module=main setting overriding all others - [rpc] \#2808 RPC validators calls IncrementAccum if necessary +- [kv indexer] \#2908 don't return false positives when searching for a prefix of a tag value - [kv indexer] \#2775 order results by index if height is the same - [rpc] \#2759 fix tx.height range queries - [rpc] \#2811 Allow integer IDs in JSON-RPC requests \ No newline at end of file diff --git a/state/txindex/kv/kv.go b/state/txindex/kv/kv.go index 6082316bf..a5913d5b7 100644 --- a/state/txindex/kv/kv.go +++ b/state/txindex/kv/kv.go @@ -412,9 +412,9 @@ LOOP: func startKey(c query.Condition, height int64) []byte { var key string if height > 0 { - key = fmt.Sprintf("%s/%v/%d", c.Tag, c.Operand, height) + key = fmt.Sprintf("%s/%v/%d/", c.Tag, c.Operand, height) } else { - key = fmt.Sprintf("%s/%v", c.Tag, c.Operand) + key = fmt.Sprintf("%s/%v/", c.Tag, c.Operand) } return []byte(key) } diff --git a/state/txindex/kv/kv_test.go b/state/txindex/kv/kv_test.go index 6657e5429..7cf16dc52 100644 --- a/state/txindex/kv/kv_test.go +++ b/state/txindex/kv/kv_test.go @@ -73,6 +73,8 @@ func TestTxSearch(t *testing.T) { {"account.number = 1 AND account.owner = 'Ivan'", 1}, // search by exact match (two tags) {"account.number = 1 AND account.owner = 'Vlad'", 0}, + // search using a prefix of the stored value + {"account.owner = 'Iv'", 0}, // search by range {"account.number >= 1 AND account.number <= 5", 1}, // search by range (lower bound)