Skip to content

Commit

Permalink
Enable parsing ATTACH statement for any db (#1060)
Browse files Browse the repository at this point in the history
* Add tests for parsing `ATTACH` statements

* Enable parsing `ATTACH` statement for any db

Earlier, it allowed attaching same db.
  • Loading branch information
avinassh authored Feb 20, 2024
1 parent 169f027 commit b769c6c
Showing 1 changed file with 42 additions and 6 deletions.
48 changes: 42 additions & 6 deletions libsql/src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

use crate::{Error, Result};
use fallible_iterator::FallibleIterator;
use sqlite3_parser::ast::{Cmd, PragmaBody, QualifiedName, Stmt, TransactionType, Expr, Id};
use sqlite3_parser::ast::{Cmd, PragmaBody, QualifiedName, Stmt, TransactionType};
use sqlite3_parser::lexer::sql::{Parser, ParserError};

/// A group of statements to be executed together.
Expand Down Expand Up @@ -118,11 +118,7 @@ impl StmtKind {
savepoint_name: Some(_),
..
}) => Some(Self::Release),
Cmd::Stmt(Stmt::Attach {
expr: Expr::Id(Id(expr)),
db_name: Expr::Id(Id(name)),
..
}) if expr == name => Some(Self::Attach),
Cmd::Stmt(Stmt::Attach { .. }) => Some(Self::Attach),
Cmd::Stmt(Stmt::Detach(_)) => Some(Self::Detach),
_ => None,
}
Expand Down Expand Up @@ -262,3 +258,43 @@ impl Statement {
)
}
}

#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_attach_same_db() {
let input = "ATTACH test AS test;";
let mut result = Statement::parse(input);

let stmt = result.next().unwrap().unwrap();
assert_eq!(stmt.kind, StmtKind::Attach);
}

#[test]
fn test_attach_database() {
let input = "ATTACH DATABASE test AS test;";
let mut result = Statement::parse(input);

let stmt = result.next().unwrap().unwrap();
assert_eq!(stmt.kind, StmtKind::Attach);
}

#[test]
fn test_attach_diff_db() {
let input = "ATTACH \"random\" AS test;";
let mut result = Statement::parse(input);

let stmt = result.next().unwrap().unwrap();
assert_eq!(stmt.kind, StmtKind::Attach);
}

#[test]
fn test_attach_database_diff_db() {
let input = "ATTACH DATABASE \"random\" AS test;";
let mut result = Statement::parse(input);

let stmt = result.next().unwrap().unwrap();
assert_eq!(stmt.kind, StmtKind::Attach);
}
}

0 comments on commit b769c6c

Please sign in to comment.