use crate::ast::NoExt;
use crate::ast::dialect::FeatureSet;
use crate::parser::Dialect;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct Redshift;
impl Dialect for Redshift {
type Ext = NoExt;
fn features(&self) -> &FeatureSet {
&FeatureSet::REDSHIFT
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::dialect::test_support::assert_full_grammar;
use crate::dialect::{Ansi, Postgres};
use crate::parse_with;
#[test]
fn redshift_parses_the_full_m1_select_grammar() {
assert_full_grammar(Redshift);
}
#[test]
fn redshift_rejects_the_deferred_postgres_heritage_forms() {
for sql in [
"SELECT * FROM t WHERE name ILIKE 'a%'",
"SELECT * FROM t WHERE name SIMILAR TO 'a%'",
"SELECT DISTINCT ON (a) a, b FROM t",
] {
assert!(
parse_with(sql, crate::ParseConfig::new(Redshift)).is_err(),
"Redshift defers the PG-heritage form {sql:?} (conservative reject)",
);
assert!(
parse_with(sql, crate::ParseConfig::new(Ansi)).is_err(),
"ANSI also rejects {sql:?} (the base Redshift derives from)",
);
assert!(
parse_with(sql, crate::ParseConfig::new(Postgres)).is_ok(),
"PostgreSQL — the fork parent — accepts {sql:?}, proving it is a real deferral",
);
}
let qualify = "SELECT * FROM t QUALIFY row_number() OVER (ORDER BY a) = 1";
assert!(
parse_with(qualify, crate::ParseConfig::new(Redshift)).is_err(),
"Redshift defers QUALIFY (conservative reject)",
);
}
#[test]
fn redshift_reads_double_quotes_as_identifiers_like_ansi() {
let quoted = "SELECT \"Col\" FROM t";
assert!(
parse_with(quoted, crate::ParseConfig::new(Redshift)).is_ok(),
"Redshift reads `\"Col\"` as a quoted identifier (standard lexis)",
);
assert!(
parse_with(quoted, crate::ParseConfig::new(Ansi)).is_ok(),
"ANSI reads `\"Col\"` as a quoted identifier too — Redshift's lexis is ANSI verbatim",
);
}
#[test]
fn redshift_features_are_the_redshift_preset() {
assert_eq!(Redshift.features(), &FeatureSet::REDSHIFT);
}
}