mirror of
https://github.com/tursodatabase/limbo.git
synced 2025-07-07 12:35:00 +00:00
Support isnull and notnull expr
This commit is contained in:
parent
14ef25ebb8
commit
5185f4bf9e
3 changed files with 59 additions and 2 deletions
|
@ -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");
|
||||
|
|
|
@ -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
20
testing/null.test
Executable 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}
|
Loading…
Add table
Add a link
Reference in a new issue