fix: prevent DROP TABLE when table is referenced by foreign keys

Add foreign key constraint check in translate_drop_table to reject
dropping tables that are referenced by foreign keys when
PRAGMA foreign_keys=ON
This commit is contained in:
joao.faria
2025-11-03 23:41:52 -03:00
parent 2c49c47300
commit 2ba643cd68
3 changed files with 33 additions and 2 deletions

View File

@@ -231,7 +231,7 @@ pub fn translate_inner(
ast::Stmt::DropTable {
if_exists,
tbl_name,
} => translate_drop_table(tbl_name, resolver, if_exists, program)?,
} => translate_drop_table(tbl_name, resolver, if_exists, program, connection)?,
ast::Stmt::DropTrigger { .. } => bail_parse_error!("DROP TRIGGER not supported yet"),
ast::Stmt::DropView {
if_exists,

View File

@@ -13,7 +13,7 @@ use crate::util::PRIMARY_KEY_AUTOMATIC_INDEX_NAME_PREFIX;
use crate::vdbe::builder::CursorType;
use crate::vdbe::insn::{CmpInsFlags, Cookie, InsertFlags, Insn};
use crate::Connection;
use crate::{bail_parse_error, Result};
use crate::{bail_constraint_error, bail_parse_error, Result};
use turso_ext::VTabKind;
@@ -608,6 +608,7 @@ pub fn translate_drop_table(
resolver: &Resolver,
if_exists: bool,
mut program: ProgramBuilder,
connection: &Connection,
) -> Result<ProgramBuilder> {
if tbl_name
.name
@@ -657,6 +658,15 @@ pub fn translate_drop_table(
tbl_name.name.as_str()
);
}
// Check if foreign keys are enabled and if this table is referenced by foreign keys
if connection.foreign_keys_enabled()
&& resolver
.schema
.any_resolved_fks_referencing(table.get_name())
{
bail_constraint_error!("FOREIGN KEY constraint failed");
}
let cdc_table = prepare_cdc_if_necessary(&mut program, resolver.schema, SQLITE_TABLEID)?;
let null_reg = program.alloc_register(); // r1