limbo_sqlite3_parser/parser/ast/
functions.rs1use crate::custom_err;
6use crate::parser::ParserError;
7use std::str::{self};
8
9use super::macros::JoinType;
10#[cfg(test)]
11use super::types::{Name, PragmaName};
12use super::types_10::{QuotedIterator, TableReferenceId};
13
14impl From<TableReferenceId> for usize {
15 fn from(value: TableReferenceId) -> Self {
16 value.0
17 }
18}
19
20impl TryFrom<&[u8]> for JoinType {
21 type Error = ParserError;
22 fn try_from(s: &[u8]) -> Result<Self, ParserError> {
23 if b"CROSS".eq_ignore_ascii_case(s) {
24 Ok(Self::INNER | Self::CROSS)
25 } else if b"FULL".eq_ignore_ascii_case(s) {
26 Ok(Self::LEFT | Self::RIGHT | Self::OUTER)
27 } else if b"INNER".eq_ignore_ascii_case(s) {
28 Ok(Self::INNER)
29 } else if b"LEFT".eq_ignore_ascii_case(s) {
30 Ok(Self::LEFT | Self::OUTER)
31 } else if b"NATURAL".eq_ignore_ascii_case(s) {
32 Ok(Self::NATURAL)
33 } else if b"RIGHT".eq_ignore_ascii_case(s) {
34 Ok(Self::RIGHT | Self::OUTER)
35 } else if b"OUTER".eq_ignore_ascii_case(s) {
36 Ok(Self::OUTER)
37 } else {
38 Err(custom_err!(
39 "unsupported JOIN type: {:?}",
40 str::from_utf8(s)
41 ))
42 }
43 }
44}
45
46pub(super) fn eq_ignore_case_and_quote(
47 mut it: QuotedIterator<'_>,
48 mut other: QuotedIterator<'_>,
49) -> bool {
50 loop {
51 match (it.next(), other.next()) {
52 (Some(b1), Some(b2)) => {
53 if !b1.eq_ignore_ascii_case(&b2) {
54 return false;
55 }
56 }
57 (None, None) => break,
58 _ => return false,
59 }
60 }
61 true
62}
63
64#[cfg(test)]
65pub(super) mod test {
66 use super::{Name, PragmaName};
67 use strum::IntoEnumIterator;
68
69 #[test]
70 fn test_dequote() {
71 assert_eq!(name("x"), "x");
72 assert_eq!(name("`x`"), "x");
73 assert_eq!(name("`x``y`"), "x`y");
74 assert_eq!(name(r#""x""#), "x");
75 assert_eq!(name(r#""x""y""#), "x\"y");
76 assert_eq!(name("[x]"), "x");
77 }
78
79 #[test]
80 fn pragma_list_sorted() {
83 let pragma_strings: Vec<String> = PragmaName::iter().map(|x| x.to_string()).collect();
84 let mut pragma_strings_sorted = pragma_strings.clone();
85 pragma_strings_sorted.sort();
86 assert_eq!(pragma_strings, pragma_strings_sorted);
87 }
88
89 fn name(s: &'static str) -> Name {
90 Name(s.to_owned())
91 }
92}