Prevent usage of lists as a key type

next
Sayan Nandan 3 years ago
parent 55457cf097
commit 7a8a22c04a

@ -99,6 +99,8 @@ pub mod groups {
pub const UNKNOWN_PROPERTY: &[u8] = "!16\nunknown-property\n".as_bytes(); pub const UNKNOWN_PROPERTY: &[u8] = "!16\nunknown-property\n".as_bytes();
/// The keyspace is not empty and hence cannot be removed /// The keyspace is not empty and hence cannot be removed
pub const KEYSPACE_NOT_EMPTY: &[u8] = "!18\nkeyspace-not-empty\n".as_bytes(); pub const KEYSPACE_NOT_EMPTY: &[u8] = "!18\nkeyspace-not-empty\n".as_bytes();
/// Bad type supplied in a DDL query for the key
pub const BAD_TYPE_FOR_KEY: &[u8] = "!16\nbad-type-for-key\n".as_bytes();
} }
pub mod full_responses { pub mod full_responses {

@ -135,6 +135,8 @@ pub(super) fn parse_table_args(
(BINSTR, LIST_STR) => 5, (BINSTR, LIST_STR) => 5,
(STR, LIST_BINSTR) => 6, (STR, LIST_BINSTR) => 6,
(STR, LIST_STR) => 7, (STR, LIST_STR) => 7,
// KVExt bad keytypes (we can't use lists as keys for obvious reasons)
(LIST_STR, _) | (LIST_BINSTR, _) => return Err(responses::groups::BAD_TYPE_FOR_KEY),
_ => return Err(responses::groups::UNKNOWN_DATA_TYPE), _ => return Err(responses::groups::UNKNOWN_DATA_TYPE),
}; };
Ok(( Ok((
@ -225,14 +227,18 @@ pub(super) fn parse_table_args_test(
let key_ty = key_ty.as_bytes(); let key_ty = key_ty.as_bytes();
let val_ty = val_ty.as_bytes(); let val_ty = val_ty.as_bytes();
let model_code: u8 = match (key_ty, val_ty) { let model_code: u8 = match (key_ty, val_ty) {
// pure KVE
(BINSTR, BINSTR) => 0, (BINSTR, BINSTR) => 0,
(BINSTR, STR) => 1, (BINSTR, STR) => 1,
(STR, STR) => 2, (STR, STR) => 2,
(STR, BINSTR) => 3, (STR, BINSTR) => 3,
// KVExt listmap
(BINSTR, LIST_BINSTR) => 4, (BINSTR, LIST_BINSTR) => 4,
(BINSTR, LIST_STR) => 5, (BINSTR, LIST_STR) => 5,
(STR, LIST_BINSTR) => 6, (STR, LIST_BINSTR) => 6,
(STR, LIST_STR) => 7, (STR, LIST_STR) => 7,
// KVExt bad keytypes (we can't use lists as keys for obvious reasons)
(LIST_STR, _) | (LIST_BINSTR, _) => return Err(responses::groups::BAD_TYPE_FOR_KEY),
_ => return Err(responses::groups::UNKNOWN_DATA_TYPE), _ => return Err(responses::groups::UNKNOWN_DATA_TYPE),
}; };
Ok(( Ok((

@ -281,6 +281,31 @@ mod parser_ddl_tests {
responses::groups::TOO_MANY_ARGUMENTS responses::groups::TOO_MANY_ARGUMENTS
); );
} }
#[test]
fn test_bad_key_type() {
let mut it = bi!("myverycooltbl", "keymap(list<str>, str)");
assert_eq!(
parse_table_args_test(&mut it).unwrap_err(),
responses::groups::BAD_TYPE_FOR_KEY
);
let mut it = bi!("myverycooltbl", "keymap(list<binstr>, binstr)");
assert_eq!(
parse_table_args_test(&mut it).unwrap_err(),
responses::groups::BAD_TYPE_FOR_KEY
);
// for consistency checks
let mut it = bi!("myverycooltbl", "keymap(list<str>, binstr)");
assert_eq!(
parse_table_args_test(&mut it).unwrap_err(),
responses::groups::BAD_TYPE_FOR_KEY
);
let mut it = bi!("myverycooltbl", "keymap(list<binstr>, str)");
assert_eq!(
parse_table_args_test(&mut it).unwrap_err(),
responses::groups::BAD_TYPE_FOR_KEY
);
}
} }
mod entity_parser_tests { mod entity_parser_tests {

Loading…
Cancel
Save