From 5185f4bf9e7f75a16d86583507bb75fae4af4b5d Mon Sep 17 00:00:00 2001 From: meteorgan Date: Sun, 11 May 2025 23:45:56 +0800 Subject: [PATCH] Support isnull and notnull expr --- core/translate/expr.rs | 40 ++++++++++++++++++++++++++++++++++++++-- testing/all.test | 1 + testing/null.test | 20 ++++++++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) create mode 100755 testing/null.test diff --git a/core/translate/expr.rs b/core/translate/expr.rs index 62f51d26e..7ade9cf6e 100644 --- a/core/translate/expr.rs +++ b/core/translate/expr.rs @@ -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"); diff --git a/testing/all.test b/testing/all.test index eaa191e6c..b0ea003b6 100755 --- a/testing/all.test +++ b/testing/all.test @@ -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 diff --git a/testing/null.test b/testing/null.test new file mode 100755 index 000000000..420f8b5d0 --- /dev/null +++ b/testing/null.test @@ -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} \ No newline at end of file