[Bug fix] Index creation schemafull checks (#4091)
This commit is contained in:
parent
bbab9fbee4
commit
3ccadb0740
3 changed files with 63 additions and 8 deletions
|
@ -5,7 +5,7 @@ use crate::err::Error;
|
||||||
use crate::iam::{Action, ResourceKind};
|
use crate::iam::{Action, ResourceKind};
|
||||||
use crate::sql::statements::info::InfoStructure;
|
use crate::sql::statements::info::InfoStructure;
|
||||||
use crate::sql::{
|
use crate::sql::{
|
||||||
statements::UpdateStatement, Base, Ident, Idioms, Index, Object, Strand, Value, Values,
|
statements::UpdateStatement, Base, Ident, Idioms, Index, Object, Part, Strand, Value, Values,
|
||||||
};
|
};
|
||||||
use derive::Store;
|
use derive::Store;
|
||||||
use reblessive::tree::Stk;
|
use reblessive::tree::Stk;
|
||||||
|
@ -52,6 +52,29 @@ impl DefineIndexStatement {
|
||||||
value: self.name.to_string(),
|
value: self.name.to_string(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
// If we are strict, check that the table exists
|
||||||
|
run.check_ns_db_tb(opt.ns(), opt.db(), &self.what, opt.strict).await?;
|
||||||
|
// Does the table exists?
|
||||||
|
match run.get_and_cache_tb(opt.ns(), opt.db(), &self.what).await {
|
||||||
|
Ok(db) => {
|
||||||
|
// Are we SchemaFull?
|
||||||
|
if db.full {
|
||||||
|
// Check that the fields exists
|
||||||
|
for idiom in self.cols.iter() {
|
||||||
|
if let Some(Part::Field(id)) = idiom.first() {
|
||||||
|
run.get_tb_field(opt.ns(), opt.db(), &self.what, id).await?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If the TB was not found, we're fine
|
||||||
|
Err(Error::TbNotFound {
|
||||||
|
..
|
||||||
|
}) => {}
|
||||||
|
// Any other error should be returned
|
||||||
|
Err(e) => return Err(e),
|
||||||
|
}
|
||||||
|
|
||||||
// Process the statement
|
// Process the statement
|
||||||
let key = crate::key::table::ix::new(opt.ns(), opt.db(), &self.what, &self.name);
|
let key = crate::key::table::ix::new(opt.ns(), opt.db(), &self.what, &self.name);
|
||||||
run.add_ns(opt.ns(), opt.strict).await?;
|
run.add_ns(opt.ns(), opt.strict).await?;
|
||||||
|
|
|
@ -854,11 +854,7 @@ async fn define_statement_index_multiple() -> Result<(), Error> {
|
||||||
let res = &mut dbs.execute(sql, &ses, None).await?;
|
let res = &mut dbs.execute(sql, &ses, None).await?;
|
||||||
assert_eq!(res.len(), 7);
|
assert_eq!(res.len(), 7);
|
||||||
//
|
//
|
||||||
let tmp = res.remove(0).result;
|
skip_ok(res, 2)?;
|
||||||
assert!(tmp.is_ok());
|
|
||||||
//
|
|
||||||
let tmp = res.remove(0).result;
|
|
||||||
assert!(tmp.is_ok());
|
|
||||||
//
|
//
|
||||||
let tmp = res.remove(0).result?;
|
let tmp = res.remove(0).result?;
|
||||||
let val = Value::parse(
|
let val = Value::parse(
|
||||||
|
@ -1236,6 +1232,39 @@ async fn define_statement_index_multiple_unique_embedded_multiple() -> Result<()
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn define_statement_index_on_schemafull_without_permission() -> Result<(), Error> {
|
||||||
|
let sql = "
|
||||||
|
DEFINE TABLE test SCHEMAFULL PERMISSIONS NONE;
|
||||||
|
DEFINE INDEX idx ON test FIELDS foo;
|
||||||
|
";
|
||||||
|
let dbs = new_ds().await?;
|
||||||
|
let ses = Session::owner().with_ns("test").with_db("test");
|
||||||
|
let mut res = &mut dbs.execute(sql, &ses, None).await?;
|
||||||
|
assert_eq!(res.len(), 2);
|
||||||
|
//
|
||||||
|
skip_ok(&mut res, 1)?;
|
||||||
|
//
|
||||||
|
let tmp = res.remove(0).result;
|
||||||
|
let s = format!("{:?}", tmp);
|
||||||
|
assert!(
|
||||||
|
tmp.is_err_and(|e| {
|
||||||
|
if let Error::FdNotFound {
|
||||||
|
value,
|
||||||
|
} = e
|
||||||
|
{
|
||||||
|
assert_eq!(value, "foo", "Wrong field: {value}");
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
"Expected error, but got: {:?}",
|
||||||
|
s
|
||||||
|
);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn define_statement_analyzer() -> Result<(), Error> {
|
async fn define_statement_analyzer() -> Result<(), Error> {
|
||||||
let sql = r#"
|
let sql = r#"
|
||||||
|
|
|
@ -197,8 +197,11 @@ pub fn with_enough_stack(
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub fn skip_ok(res: &mut Vec<Response>, skip: usize) -> Result<(), Error> {
|
pub fn skip_ok(res: &mut Vec<Response>, skip: usize) -> Result<(), Error> {
|
||||||
for _ in 0..skip {
|
for i in 0..skip {
|
||||||
let _ = res.remove(0).result?;
|
let r = res.remove(0).result;
|
||||||
|
let _ = r.is_err_and(|e| {
|
||||||
|
panic!("Statement #{i} fails with: {e}");
|
||||||
|
});
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue