From 6efb823bde199bf68218990504a8a04b3910923a Mon Sep 17 00:00:00 2001 From: gwenn Date: Sat, 16 Mar 2024 08:02:47 +0100 Subject: [PATCH] Fix usages of `sqlite3_error_msg` --- src/lexer/sql/test.rs | 35 ++++++++++++++++++++++++++++++++--- src/parser/mod.rs | 5 ----- src/parser/parse.y | 13 ++++++------- 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/lexer/sql/test.rs b/src/lexer/sql/test.rs index 767846a..18d80f4 100644 --- a/src/lexer/sql/test.rs +++ b/src/lexer/sql/test.rs @@ -63,11 +63,11 @@ fn create_table_without_column() { #[test] fn vtab_args() -> Result<(), Error> { - let sql = r#"CREATE VIRTUAL TABLE mail USING fts3( + let sql = b"CREATE VIRTUAL TABLE mail USING fts3( subject VARCHAR(256) NOT NULL, body TEXT CHECK(length(body)<10240) -);"#; - let r = parse_cmd(sql.as_bytes()); +);"; + let r = parse_cmd(sql); let Cmd::Stmt(Stmt::CreateVirtualTable { tbl_name: QualifiedName { name: Name(tbl_name), @@ -293,6 +293,35 @@ fn unknown_table_option() { expect_parser_err_msg(b"CREATE TABLE t(x) WITHOUT o", "unknown table option: o"); } +#[test] +fn qualified_table_name_within_triggers() { + expect_parser_err_msg( + b"CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN + DELETE FROM main.t2; + END;", + "qualified table names are not allowed on INSERT, UPDATE, and DELETE statements \ + within triggers", + ); +} + +#[test] +fn indexed_by_clause_within_triggers() { + expect_parser_err_msg( + b"CREATE TRIGGER main.t16err5 AFTER INSERT ON tA BEGIN + UPDATE t16 INDEXED BY t16a SET rowid=rowid+1 WHERE a=1; + END;", + "the INDEXED BY clause is not allowed on UPDATE or DELETE statements \ + within triggers", + ); + expect_parser_err_msg( + b"CREATE TRIGGER main.t16err6 AFTER INSERT ON tA BEGIN + DELETE FROM t16 NOT INDEXED WHERE a=123; + END;", + "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements \ + within triggers", + ); +} + fn expect_parser_err_msg(input: &[u8], error_msg: &str) { expect_parser_err(input, ParserError::Custom(error_msg.to_owned())) } diff --git a/src/parser/mod.rs b/src/parser/mod.rs index dd1d9e7..f249de3 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -1,5 +1,4 @@ //! SQLite parser -use log::error; pub mod ast; pub mod parse { @@ -134,10 +133,6 @@ impl<'input> Context<'input> { self.module_args.take() } - fn sqlite3_error_msg(&mut self, msg: &str) { - error!("parser error: {}", msg); - } - /// This routine is called after a single SQL statement has been parsed. fn sqlite3_finish_coding(&mut self) { self.done = true; diff --git a/src/parser/parse.y b/src/parser/parse.y index 487a6d4..7d1b79c 100644 --- a/src/parser/parse.y +++ b/src/parser/parse.y @@ -1210,9 +1210,8 @@ trigger_cmd_list(A) ::= trigger_cmd(X) SEMI. { trnm(A) ::= nm(A). trnm(A) ::= nm DOT nm(X). { A = X; - self.ctx.sqlite3_error_msg( - "qualified table names are not allowed on INSERT, UPDATE, and DELETE \ - statements within triggers"); + return Err(custom_err!("qualified table names are not allowed on INSERT, UPDATE, and DELETE \ + statements within triggers")); } // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE @@ -1221,14 +1220,14 @@ trnm(A) ::= nm DOT nm(X). { // tridxby ::= . tridxby ::= INDEXED BY nm. { - self.ctx.sqlite3_error_msg( + return Err(custom_err!( "the INDEXED BY clause is not allowed on UPDATE or DELETE statements \ - within triggers"); + within triggers")); } tridxby ::= NOT INDEXED. { - self.ctx.sqlite3_error_msg( + return Err(custom_err!( "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements \ - within triggers"); + within triggers")); }