Support isnull and notnull expr

This commit is contained in:
meteorgan 2025-05-11 23:45:56 +08:00
parent 14ef25ebb8
commit 5185f4bf9e
3 changed files with 59 additions and 2 deletions

View file

@ -1949,7 +1949,25 @@ pub fn translate_expr(
ast::Expr::InList { .. } => todo!(),
ast::Expr::InSelect { .. } => todo!(),
ast::Expr::InTable { .. } => todo!(),
ast::Expr::IsNull(_) => todo!(),
ast::Expr::IsNull(expr) => {
let reg = program.alloc_register();
translate_expr(program, referenced_tables, expr, reg, resolver)?;
program.emit_insn(Insn::Integer {
value: 1,
dest: target_register,
});
let label = program.allocate_label();
program.emit_insn(Insn::IsNull {
reg,
target_pc: label,
});
program.emit_insn(Insn::Integer {
value: 0,
dest: target_register,
});
program.preassign_label_to_next_insn(label);
Ok(target_register)
}
ast::Expr::Like { not, .. } => {
let like_reg = if *not {
program.alloc_register()
@ -2039,7 +2057,25 @@ pub fn translate_expr(
}
},
ast::Expr::Name(_) => todo!(),
ast::Expr::NotNull(_) => todo!(),
ast::Expr::NotNull(expr) => {
let reg = program.alloc_register();
translate_expr(program, referenced_tables, expr, reg, resolver)?;
program.emit_insn(Insn::Integer {
value: 1,
dest: target_register,
});
let label = program.allocate_label();
program.emit_insn(Insn::NotNull {
reg,
target_pc: label,
});
program.emit_insn(Insn::Integer {
value: 0,
dest: target_register,
});
program.preassign_label_to_next_insn(label);
Ok(target_register)
}
ast::Expr::Parenthesized(exprs) => {
if exprs.is_empty() {
crate::bail_parse_error!("parenthesized expression with no arguments");

View file

@ -32,3 +32,4 @@ source $testdir/drop_index.test
source $testdir/default_value.test
source $testdir/boolean.test
source $testdir/literal.test
source $testdir/null.test

20
testing/null.test Executable file
View file

@ -0,0 +1,20 @@
#!/usr/bin/env tclsh
set testdir [file dirname $argv0]
source $testdir/tester.tcl
do_execsql_test isnull {
select null isnull, 'hi' isnull;
} {1|0}
do_execsql_test is-null {
select null is null, 'hi' is null;
} {1|0}
do_execsql_test notnull {
select null notnull, 'hi' notnull;
} {0|1}
do_execsql_test not-null {
select null not null, 'hi' not null;
} {0|1}