|
|
|
@ -132,7 +132,7 @@ impl<'a> SessionTx<'a> {
|
|
|
|
|
} = meta;
|
|
|
|
|
|
|
|
|
|
match op {
|
|
|
|
|
RelationOp::Rm => self.remove_from_relation(
|
|
|
|
|
RelationOp::Rm | RelationOp::Delete => self.remove_from_relation(
|
|
|
|
|
db,
|
|
|
|
|
res_iter,
|
|
|
|
|
headers,
|
|
|
|
@ -144,6 +144,7 @@ impl<'a> SessionTx<'a> {
|
|
|
|
|
&mut relation_store,
|
|
|
|
|
metadata,
|
|
|
|
|
key_bindings,
|
|
|
|
|
op == RelationOp::Delete,
|
|
|
|
|
*span,
|
|
|
|
|
)?,
|
|
|
|
|
RelationOp::Ensure => self.ensure_in_relation(
|
|
|
|
@ -178,7 +179,8 @@ impl<'a> SessionTx<'a> {
|
|
|
|
|
key_bindings,
|
|
|
|
|
*span,
|
|
|
|
|
)?,
|
|
|
|
|
RelationOp::Create | RelationOp::Replace | RelationOp::Put | RelationOp::Insert => self.put_into_relation(
|
|
|
|
|
RelationOp::Create | RelationOp::Replace | RelationOp::Put | RelationOp::Insert => self
|
|
|
|
|
.put_into_relation(
|
|
|
|
|
db,
|
|
|
|
|
res_iter,
|
|
|
|
|
headers,
|
|
|
|
@ -270,8 +272,16 @@ impl<'a> SessionTx<'a> {
|
|
|
|
|
.map(|ex| ex.extract_data(&tuple, cur_vld))
|
|
|
|
|
.try_collect()?;
|
|
|
|
|
|
|
|
|
|
let key = relation_store.encode_key_for_store(&extracted, span)?;
|
|
|
|
|
|
|
|
|
|
if is_insert {
|
|
|
|
|
if relation_store.exists(self, &extracted[..relation_store.metadata.keys.len()])? {
|
|
|
|
|
let already_exists = if relation_store.is_temp {
|
|
|
|
|
self.temp_store_tx.exists(&key, true)?
|
|
|
|
|
} else {
|
|
|
|
|
self.store_tx.exists(&key, true)?
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if already_exists {
|
|
|
|
|
bail!(TransactAssertionFailure {
|
|
|
|
|
relation: relation_store.name.to_string(),
|
|
|
|
|
key: extracted,
|
|
|
|
@ -280,7 +290,6 @@ impl<'a> SessionTx<'a> {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let key = relation_store.encode_key_for_store(&extracted, span)?;
|
|
|
|
|
let val = relation_store.encode_val_for_store(&extracted, span)?;
|
|
|
|
|
|
|
|
|
|
if need_to_collect
|
|
|
|
@ -909,6 +918,7 @@ impl<'a> SessionTx<'a> {
|
|
|
|
|
relation_store: &mut RelationHandle,
|
|
|
|
|
metadata: &StoredRelationMetadata,
|
|
|
|
|
key_bindings: &[Symbol],
|
|
|
|
|
check_exists: bool,
|
|
|
|
|
span: SourceSpan,
|
|
|
|
|
) -> Result<()> {
|
|
|
|
|
let is_callback_target = callback_targets.contains(&relation_store.name);
|
|
|
|
@ -944,6 +954,20 @@ impl<'a> SessionTx<'a> {
|
|
|
|
|
.map(|ex| ex.extract_data(&tuple, cur_vld))
|
|
|
|
|
.try_collect()?;
|
|
|
|
|
let key = relation_store.encode_key_for_store(&extracted, span)?;
|
|
|
|
|
if check_exists {
|
|
|
|
|
let exists = if relation_store.is_temp {
|
|
|
|
|
self.temp_store_tx.exists(&key, false)?
|
|
|
|
|
} else {
|
|
|
|
|
self.store_tx.exists(&key, false)?
|
|
|
|
|
};
|
|
|
|
|
if !exists {
|
|
|
|
|
bail!(TransactAssertionFailure {
|
|
|
|
|
relation: relation_store.name.to_string(),
|
|
|
|
|
key: extracted,
|
|
|
|
|
notice: "key does not exists in database".to_string()
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if need_to_collect || has_indices || has_hnsw_indices || has_fts_indices {
|
|
|
|
|
if let Some(existing) = self.store_tx.get(&key, false)? {
|
|
|
|
|
let mut tup = extracted.clone();
|
|
|
|
|