diff --git a/src/common/meta/src/kv_backend/memory.rs b/src/common/meta/src/kv_backend/memory.rs index 948992388c..1c4016e775 100644 --- a/src/common/meta/src/kv_backend/memory.rs +++ b/src/common/meta/src/kv_backend/memory.rs @@ -308,10 +308,11 @@ mod tests { use super::*; use crate::error::Error; use crate::kv_backend::test::{ - prepare_kv, test_kv_batch_delete, test_kv_batch_get, test_kv_compare_and_put, - test_kv_delete_range, test_kv_put, test_kv_range, test_kv_range_2, test_txn_compare_equal, - test_txn_compare_greater, test_txn_compare_less, test_txn_compare_not_equal, - test_txn_one_compare_op, text_txn_multi_compare_op, + prepare_kv, prepare_kv_with_prefix, test_kv_batch_delete, test_kv_batch_get, + test_kv_compare_and_put, test_kv_delete_range, test_kv_put, test_kv_range, test_kv_range_2, + test_simple_kv_range, test_txn_compare_equal, test_txn_compare_greater, + test_txn_compare_less, test_txn_compare_not_equal, test_txn_one_compare_op, + text_txn_multi_compare_op, unprepare_kv, }; async fn mock_mem_store_with_data() -> MemoryKvBackend { @@ -380,4 +381,12 @@ mod tests { test_txn_compare_less(&kv_backend).await; test_txn_compare_not_equal(&kv_backend).await; } + #[tokio::test] + async fn test_mem_all_range() { + let kv_backend = MemoryKvBackend::::new(); + let prefix = b""; + prepare_kv_with_prefix(&kv_backend, prefix.to_vec()).await; + test_simple_kv_range(&kv_backend).await; + unprepare_kv(&kv_backend, prefix).await; + } } diff --git a/src/common/meta/src/kv_backend/rds/mysql.rs b/src/common/meta/src/kv_backend/rds/mysql.rs index 81e0e97a16..b6281a5490 100644 --- a/src/common/meta/src/kv_backend/rds/mysql.rs +++ b/src/common/meta/src/kv_backend/rds/mysql.rs @@ -160,7 +160,7 @@ impl<'a> MySqlTemplateFactory<'a> { range_template: RangeTemplate { point: format!("SELECT k, v FROM `{table_name}` WHERE k = ?"), range: format!("SELECT k, v FROM `{table_name}` WHERE k >= ? AND k < ? ORDER BY k"), - full: format!("SELECT k, v FROM `{table_name}` ? ORDER BY k"), + full: format!("SELECT k, v FROM `{table_name}` ORDER BY k"), left_bounded: format!("SELECT k, v FROM `{table_name}` WHERE k >= ? ORDER BY k"), prefix: format!("SELECT k, v FROM `{table_name}` WHERE k LIKE ? ORDER BY k"), }, @@ -538,9 +538,9 @@ mod tests { prepare_kv_with_prefix, test_kv_batch_delete_with_prefix, test_kv_batch_get_with_prefix, test_kv_compare_and_put_with_prefix, test_kv_delete_range_with_prefix, test_kv_put_with_prefix, test_kv_range_2_with_prefix, test_kv_range_with_prefix, - test_txn_compare_equal, test_txn_compare_greater, test_txn_compare_less, - test_txn_compare_not_equal, test_txn_one_compare_op, text_txn_multi_compare_op, - unprepare_kv, + test_simple_kv_range, test_txn_compare_equal, test_txn_compare_greater, + test_txn_compare_less, test_txn_compare_not_equal, test_txn_one_compare_op, + text_txn_multi_compare_op, unprepare_kv, }; async fn build_mysql_kv_backend(table_name: &str) -> Option { @@ -592,6 +592,15 @@ mod tests { unprepare_kv(&kv_backend, prefix).await; } + #[tokio::test] + async fn test_mysql_all_range() { + let kv_backend = build_mysql_kv_backend("simple_range_test").await.unwrap(); + let prefix = b""; + prepare_kv_with_prefix(&kv_backend, prefix.to_vec()).await; + test_simple_kv_range(&kv_backend).await; + unprepare_kv(&kv_backend, prefix).await; + } + #[tokio::test] async fn test_mysql_batch_get() { let kv_backend = build_mysql_kv_backend("batch_get_test").await.unwrap(); diff --git a/src/common/meta/src/kv_backend/rds/postgres.rs b/src/common/meta/src/kv_backend/rds/postgres.rs index 6404a1eead..349e233e63 100644 --- a/src/common/meta/src/kv_backend/rds/postgres.rs +++ b/src/common/meta/src/kv_backend/rds/postgres.rs @@ -164,7 +164,7 @@ impl<'a> PgSqlTemplateFactory<'a> { range: format!( "SELECT k, v FROM \"{table_name}\" WHERE k >= $1 AND k < $2 ORDER BY k" ), - full: format!("SELECT k, v FROM \"{table_name}\" $1 ORDER BY k"), + full: format!("SELECT k, v FROM \"{table_name}\" ORDER BY k"), left_bounded: format!("SELECT k, v FROM \"{table_name}\" WHERE k >= $1 ORDER BY k"), prefix: format!("SELECT k, v FROM \"{table_name}\" WHERE k LIKE $1 ORDER BY k"), }, @@ -511,9 +511,9 @@ mod tests { prepare_kv_with_prefix, test_kv_batch_delete_with_prefix, test_kv_batch_get_with_prefix, test_kv_compare_and_put_with_prefix, test_kv_delete_range_with_prefix, test_kv_put_with_prefix, test_kv_range_2_with_prefix, test_kv_range_with_prefix, - test_txn_compare_equal, test_txn_compare_greater, test_txn_compare_less, - test_txn_compare_not_equal, test_txn_one_compare_op, text_txn_multi_compare_op, - unprepare_kv, + test_simple_kv_range, test_txn_compare_equal, test_txn_compare_greater, + test_txn_compare_less, test_txn_compare_not_equal, test_txn_one_compare_op, + text_txn_multi_compare_op, unprepare_kv, }; async fn build_pg_kv_backend(table_name: &str) -> Option { @@ -573,6 +573,15 @@ mod tests { unprepare_kv(&kv_backend, prefix).await; } + #[tokio::test] + async fn test_pg_all_range() { + let kv_backend = build_pg_kv_backend("simple_range_test").await.unwrap(); + let prefix = b""; + prepare_kv_with_prefix(&kv_backend, prefix.to_vec()).await; + test_simple_kv_range(&kv_backend).await; + unprepare_kv(&kv_backend, prefix).await; + } + #[tokio::test] async fn test_pg_batch_get() { let kv_backend = build_pg_kv_backend("batch_get_test").await.unwrap(); diff --git a/src/common/meta/src/kv_backend/test.rs b/src/common/meta/src/kv_backend/test.rs index bb38c5a205..7e2c364b82 100644 --- a/src/common/meta/src/kv_backend/test.rs +++ b/src/common/meta/src/kv_backend/test.rs @@ -108,6 +108,44 @@ pub async fn test_kv_range(kv_backend: &impl KvBackend) { test_kv_range_with_prefix(kv_backend, vec![]).await; } +pub async fn test_simple_kv_range(kvbackend: &impl KvBackend) { + { + let full_query = RangeRequest::new().with_range(vec![0], vec![0]); + let response = kvbackend.range(full_query).await.unwrap(); + assert_eq!(response.kvs.len(), 4); + } + { + let point_query = RangeRequest::new().with_range(b"key11".to_vec(), vec![]); + let response = kvbackend.range(point_query).await.unwrap(); + assert_eq!(response.kvs.len(), 1); + } + { + let left_bounded_query = RangeRequest::new().with_range(b"key1".to_vec(), vec![0]); + let response = kvbackend.range(left_bounded_query).await.unwrap(); + assert_eq!(response.kvs.len(), 4); + } + { + let range_query = RangeRequest::new().with_range(b"key1".to_vec(), b"key11".to_vec()); + let response = kvbackend.range(range_query).await.unwrap(); + assert_eq!(response.kvs.len(), 1); + } + { + let prefix_query = RangeRequest::new().with_range(b"key1".to_vec(), b"key2".to_vec()); + let response = kvbackend.range(prefix_query).await.unwrap(); + assert_eq!(response.kvs.len(), 2); + } + { + let range_query = RangeRequest::new().with_range(b"key10".to_vec(), b"key100".to_vec()); + let response = kvbackend.range(range_query).await.unwrap(); + assert_eq!(response.kvs.len(), 0); + } + { + let prefix_query = RangeRequest::new().with_range(b"key10".to_vec(), b"key11".to_vec()); + let response = kvbackend.range(prefix_query).await.unwrap(); + assert_eq!(response.kvs.len(), 0); + } +} + pub async fn test_kv_range_with_prefix(kv_backend: &impl KvBackend, prefix: Vec) { let key = [prefix.clone(), b"key1".to_vec()].concat(); let key11 = [prefix.clone(), b"key11".to_vec()].concat();