Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion parser/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "parser"
edition = "2021"
edition = "2024"

[lib]
crate-type = ["cdylib", "rlib"]
Expand Down
57 changes: 28 additions & 29 deletions parser/src/nullable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,42 +20,41 @@ pub fn is_column_nullable(
let mut parser = Parser::new(query.as_bytes());
let cmd = parser.next().ok()??;

if let ast::Cmd::Stmt(ast::Stmt::Select(select)) = cmd {
if let ast::OneSelect::Select {
if let ast::Cmd::Stmt(ast::Stmt::Select(select)) = cmd
&& let ast::OneSelect::Select {
from: Some(from),
where_clause,
..
} = select.body.select
{
// If a column is declared as not null we only need to prove that the table it came from is always present
if notnull {
return get_used_table_name(table_name, &from).map(|_| NullableResult::NotNull);
}
{
// If a column is declared as not null we only need to prove that the table it came from is always present
if notnull {
return get_used_table_name(table_name, &from).map(|_| NullableResult::NotNull);
}

let used_table_name = get_used_table_name(table_name, &from)?;
let used_table_name = get_used_table_name(table_name, &from)?;

if let Some(where_clause) = where_clause {
let result = test_expr(column, used_table_name, &where_clause);
if result.is_some() {
return result;
}
if let Some(where_clause) = where_clause {
let result = test_expr(column, used_table_name, &where_clause);
if result.is_some() {
return result;
}
}

if let Some(joins) = &from.joins {
// https://www.sqlite.org/lang_select.html#special_handling_of_cross_join_
return joins.iter().find_map(|join| match join {
ast::JoinedSelectTable {
operator:
ast::JoinOperator::Comma
| ast::JoinOperator::TypedJoin(None)
| ast::JoinOperator::TypedJoin(Some(ast::JoinType::INNER))
| ast::JoinOperator::TypedJoin(Some(ast::JoinType::CROSS)),
constraint: Some(ast::JoinConstraint::On(expr)),
..
} => test_expr(column, used_table_name, expr),
_ => None,
});
}
if let Some(joins) = &from.joins {
// https://www.sqlite.org/lang_select.html#special_handling_of_cross_join_
return joins.iter().find_map(|join| match join {
ast::JoinedSelectTable {
operator:
ast::JoinOperator::Comma
| ast::JoinOperator::TypedJoin(None)
| ast::JoinOperator::TypedJoin(Some(ast::JoinType::INNER))
| ast::JoinOperator::TypedJoin(Some(ast::JoinType::CROSS)),
constraint: Some(ast::JoinConstraint::On(expr)),
..
} => test_expr(column, used_table_name, expr),
_ => None,
});
}
}

Expand Down Expand Up @@ -132,7 +131,7 @@ fn test_expr(column_name: &str, table_name: &str, expr: &ast::Expr) -> Option<Nu
if expr_matches_name(column_name, table_name, lhs)
|| expr_matches_name(column_name, table_name, rhs) =>
{
return Some(NullableResult::NotNull)
return Some(NullableResult::NotNull);
}
// column is null
ast::Expr::Binary(left, ast::Operator::Is, right)
Expand Down
2 changes: 1 addition & 1 deletion parser/src/parameters.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use fallible_iterator::FallibleIterator;
use indexmap::IndexSet;
use sqlite3_parser::{
ast::{fmt::ToTokens, ParameterInfo},
ast::{ParameterInfo, fmt::ToTokens},
lexer::sql::Parser,
};
use wasm_bindgen::prelude::*;
Expand Down
2 changes: 1 addition & 1 deletion parser/src/prefix.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use fallible_iterator::FallibleIterator;
use sqlite3_parser::{
ast::{fmt::ToTokens, ParameterInfo},
ast::{ParameterInfo, fmt::ToTokens},
lexer::sql::Parser,
};
use wasm_bindgen::prelude::*;
Expand Down